diff options
author | Mirko Vogt <mirko@openwrt.org> | 2009-07-05 11:37:52 +0000 |
---|---|---|
committer | Mirko Vogt <mirko@openwrt.org> | 2009-07-05 11:37:52 +0000 |
commit | 36293686234f12e5f5fc166a6b38a1efec36da2d (patch) | |
tree | 6b6266b6489c814295db61472c551f0cc3d0d99d /target/linux | |
parent | 254b492ff52430cb1b8b3d26e17a0363688a2742 (diff) | |
download | upstream-36293686234f12e5f5fc166a6b38a1efec36da2d.tar.gz upstream-36293686234f12e5f5fc166a6b38a1efec36da2d.tar.bz2 upstream-36293686234f12e5f5fc166a6b38a1efec36da2d.zip |
purge out config and patches for 2.6.29 as 2.6.30.1 is now default and stable
SVN-Revision: 16685
Diffstat (limited to 'target/linux')
7 files changed, 0 insertions, 256940 deletions
diff --git a/target/linux/s3c24xx/config-2.6.29 b/target/linux/s3c24xx/config-2.6.29 deleted file mode 100644 index 98e3600ed4..0000000000 --- a/target/linux/s3c24xx/config-2.6.29 +++ /dev/null @@ -1,537 +0,0 @@ -# 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_BAST is not set -CONFIG_ARCH_FLATMEM_HAS_HOLES=y -# CONFIG_ARCH_H1940 is not set -# CONFIG_ARCH_HAS_ILOG2_U32 is not set -# CONFIG_ARCH_HAS_ILOG2_U64 is not set -CONFIG_ARCH_REQUIRE_GPIOLIB=y -CONFIG_ARCH_S3C2410=y -CONFIG_ARCH_S3C2440=y -# CONFIG_ARCH_SELECT_MEMORY_MODEL 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_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_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_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_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=y -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_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_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=y -# CONFIG_LOGO_LINUX_CLUT224 is not set -# CONFIG_LOGO_LINUX_MONO is not set -# CONFIG_LOGO_LINUX_VGA16 is not set -CONFIG_LOGO_OPENWRT_CLUT224=y -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_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_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_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_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_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_OPTION=y -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 deleted file mode 100644 index 4ad0fe6c1b..0000000000 --- a/target/linux/s3c24xx/patches-2.6.29/000-downgrade-to-rc3.patch +++ /dev/null @@ -1,121447 +0,0 @@ -diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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" (®s->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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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(¤t->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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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 *) ®s->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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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 *) ¤t->thread.TS_FPR(reg); -- char *ptr1 = (char *) ¤t->thread.TS_FPR(reg+1); -- int i, ret, sw = 0; -+ char *ptr = (char *) ¤t->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 *) ¤t->thread.TS_FPR(reg); - int ret = 0; - - flush_vsx_to_thread(current); - -- if (reg < 32) -- ptr = (char *) ¤t->thread.TS_FPR(reg); -- else -- ptr = (char *) ¤t->thread.vr[reg - 32]; -- - if (flags & ST) - ret = __copy_to_user(addr, ptr, length); - else { -diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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(¤t_cpu_data); - return 0; - } - -diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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(¤t_cpu_data, X86_FEATURE_CLFLUSH_MONITOR)) -- clflush((void *)¤t_thread_info()->flags); -- - __monitor((void *)¤t_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(¤t_cpu_data, X86_FEATURE_CLFLUSH_MONITOR)) -- clflush((void *)¤t_thread_info()->flags); -- - __monitor((void *)¤t_thread_info()->flags, 0, 0); - smp_mb(); - if (!need_resched()) -diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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(®s); -- -- info.regs = ®s; -- math_emulate(&info); -+ conditional_sti(regs); -+ math_emulate(0); - } else { - math_state_restore(); /* interrupts still off */ -- conditional_sti(®s); -+ conditional_sti(regs); - } - #else - math_state_restore(); -diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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 = ¶ms->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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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 *) ð_addr[2] = swab32(addr[0]); -- *(u16 *) ð_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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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, ®_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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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, ®, 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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, ®, GPIO_CTL_REG_KER); - EFX_SET_OWORD_FIELD(reg, GPIO2_OEN, true); -+ EFX_SET_OWORD_FIELD(reg, GPIO2_OUT, false); - falcon_write(efx, ®, 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, ®, 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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, ®32); - 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, ®16); -+ 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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(®->isp25mq.req_q_in, 0); - WRT_REG_DWORD(®->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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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 *)®24->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(®->hccr, HCCRX_CLR_RISC_INT); -+ - spin_unlock_irq(&ha->hardware_lock); - - return IRQ_HANDLED; -diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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(®->req_q_in, 0); - WRT_REG_DWORD(®->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(®->rsp_q_out, 0); - WRT_REG_DWORD(®->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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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(ð_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(ð_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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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, <mp, 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, <mp, 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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(¤t->sighand->siglock); - -diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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 = ¤t_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 = ¤t_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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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, ×); -+ thread_group_cputime(tsk, ×); - 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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(×->lock); -+ times->utime = cputime_add(times->utime, cputime); -+ spin_unlock(×->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(×->lock); -+ times->stime = cputime_add(times->stime, cputime); -+ spin_unlock(×->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(×->lock); -+ times->sum_exec_runtime += ns; -+ spin_unlock(×->lock); - } -diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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(¤t->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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/Makefile linux-2.6.29-rc3.owrt/Makefile ---- linux-2.6.29.owrt/Makefile 2009-05-11 01:33:47.000000000 +0200 -+++ linux-2.6.29-rc3.owrt/Makefile 2009-05-11 01:34:47.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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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(¤t->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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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, ¶m) != 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' 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 deleted file mode 100644 index 713d1ffdfe..0000000000 --- a/target/linux/s3c24xx/patches-2.6.29/001-merge-openmoko.patch +++ /dev/null @@ -1,96378 +0,0 @@ -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" (®s->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(®s, 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(®s); -+} -+/* -------- 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 = >a01_pm_gps_dev.dev, -+ .supply = "GPS_2V8", -+ }, -+}; -+ -+static struct regulator_consumer_supply d1reg_consumers[] = { -+ { -+ .dev = >a01_pm_gps_dev.dev, -+ .supply = "GPS_3V", -+ }, -+ { -+ .dev = >a01_pm_bt_dev.dev, -+ .supply = "BT_3V1", -+ }, -+}; -+ -+static struct regulator_consumer_supply dcd_consumers[] = { -+ { -+ .dev = >a01_pm_gps_dev.dev, -+ .supply = "GPS_3V3", -+ }, -+ { -+ .dev = >a01_pm_gps_dev.dev, -+ .supply = "GPS_1V5", -+ }, -+}; -+ -+static struct regulator_consumer_supply d2reg_consumers[] = { -+ { -+ .dev = >a01_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 = >a01_bat_pdata, -+ } -+}; -+ -+static void gta01_pcf_probe_done(struct pcf50606 *pcf) -+{ -+ gta01_pcf = pcf; -+ gta01_bat.dev.parent = pcf->dev; -+ platform_device_register(>a01_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(>a01_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(>a01_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(®_init_data[PCF50606_REGULATOR_DCUD], -+ 1, 18000000, 1800000); -+ cfg_pmu_vrail(®_init_data[PCF50606_REGULATOR_D1REG], -+ 0, 3000000, 3000000); -+ cfg_pmu_vrail(®_init_data[PCF50606_REGULATOR_D3REG], -+ 0, 2800000, 2800000); -+ cfg_pmu_vrail(®_init_data[PCF50606_REGULATOR_DCD], -+ 0, 3500000, 3500000); -+ break; -+ case GTA01v3_SYSTEM_REV: -+ cfg_pmu_vrail(®_init_data[PCF50606_REGULATOR_D1REG], -+ 0, 3000000, 3000000); -+ cfg_pmu_vrail(®_init_data[PCF50606_REGULATOR_D2REG], -+ 0, 3300000, 3300000); -+ cfg_pmu_vrail(®_init_data[PCF50606_REGULATOR_D3REG], -+ 0, 3300000, 3300000); -+ cfg_pmu_vrail(®_init_data[PCF50606_REGULATOR_DCD], -+ 0, 3300000, 3300000); -+ cfg_pmu_vrail(®_init_data[PCF50606_REGULATOR_DCUD], -+ 1, 1800000, 1800000); -+ cfg_pmu_vrail(®_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 = >a01_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(>a01_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, >a01_ts_group.config}, -+ {&ts_filter_median_api, >a01_ts_median.config}, -+ {&ts_filter_mean_api, >a01_ts_mean.config}, -+ {&ts_filter_linear_api, >a01_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 = >a01_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 = >a01_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 = >a01_usb_info; -+ s3c_device_nand.dev.platform_data = >a01_nand_info; -+ s3c_device_sdi.dev.platform_data = >a01_mmc_cfg; -+ -+ s3c24xx_fb_set_platdata(>a01_lcd_cfg); -+ -+ INIT_WORK(>a01_udc_vbus_drawer.work, __gta01_udc_vbus_draw); -+ s3c24xx_udc_set_platdata(>a01_udc_cfg); -+ s3c_i2c0_set_platdata(NULL); -+ set_s3c2410ts_info(>a01_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(>a01_bl_dev); -+ platform_device_register(>a01_button_dev); -+ platform_device_register(>a01_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(>a01_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 = >a01_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(>a02_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(>a02_fiq_pwm_timer); -+ if (rc) -+ goto bail; -+ -+ s3c2410_pwm_start(>a02_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(>a02_charger_work, -+ GTA02_CHARGER_CONFIGURE_TIMEOUT); -+ return; -+ } else if (irq == PCF50633_IRQ_USBREM) { -+ cancel_delayed_work_sync(>a02_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(>a02_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 = >a01_pm_bt_dev.dev, -+ .supply = "BT_3V2", -+ }, -+}; -+ -+static struct regulator_consumer_supply ldo5_consumers[] = { -+ { -+ .dev = >a01_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 = >a02_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 = >a02_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 = >a02_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 = >a02_nor_flash_data, -+ }, -+ .resource = >a02_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 = >a02_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, >a02_ts_group.config}, -+ {&ts_filter_median_api, >a02_ts_median.config}, -+ {&ts_filter_mean_api, >a02_ts_mean.config}, -+ {&ts_filter_linear_api, >a02_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 = >a02_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(>a02_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 = >a02_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 = >a02_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 = >a02_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 = { -+ >a02_version_device, -+ &s3c_device_usb, -+ &s3c_device_wdt, -+ >a02_memconfig_device, -+ &s3c_device_sdi, -+ &s3c_device_usbgadget, -+ &s3c_device_nand, -+ >a02_nor_flash, -+ -+ &s3c24xx_pwm_device, -+ >a02_led_dev, -+ >a02_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 */ -+ >a02_pm_gsm_dev, -+ >a02_pm_usbhost_dev, -+ >a02_spi_gpio_dev, /* input 2 and 3 */ -+ >a02_button_dev, /* input 4 */ -+ >a02_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 = >a01_pm_bt_dev; -+ break; -+ case PCF50633_REGULATOR_LDO5: -+ pdev = >a01_pm_gps_dev; -+ break; -+ case PCF50633_REGULATOR_HCLDO: -+ pdev = >a02_glamo_dev; -+ break; -+ default: -+ return; -+ } -+ -+ pdev->dev.parent = ®ulator->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(>a02_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 = >a02_usb_info; -+ s3c_device_nand.dev.platform_data = >a02_nand_info; -+ s3c_device_sdi.dev.platform_data = >a02_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(>a02_udc_cfg); -+ s3c_i2c0_set_platdata(NULL); -+ set_s3c2410ts_info(>a02_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(>a02_hdq_device); -+#endif -+#ifdef CONFIG_LEDS_NEO1973_VIBRATOR -+ gta02_vibrator_dev.dev.parent = &s3c24xx_pwm_device.dev; -+ platform_device_register(>a02_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 = ®ulator->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(>a02_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(>a02_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(>a02_wlan_rfkill_lock)); -+ BUG_ON(gta02_wlan_rfkill_cb); -+ gta02_wlan_rfkill_cb = cb; -+ gta02_wlan_rfkill_user = user; -+ mutex_unlock(>a02_wlan_rfkill_lock); -+} -+EXPORT_SYMBOL_GPL(gta02_wlan_set_rfkill_cb); -+ -+void gta02_wlan_clear_rfkill_cb(void) -+{ -+ mutex_lock(>a02_wlan_rfkill_lock); -+ BUG_ON(!gta02_wlan_rfkill_cb); -+ gta02_wlan_rfkill_cb = NULL; -+ mutex_unlock(>a02_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(>a02_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(>a02_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(>a02_wlan_driver); -+} -+ -+static void gta02_wlan_exit(void) -+{ -+ platform_driver_unregister(>a02_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, >a01_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, >a01_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(>a01_bt_driver); -+} -+ -+static void gta01_bt_exit(void) -+{ -+ platform_driver_unregister(>a01_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, -+ >a01_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, -+ >a02_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, >a01_gps_attr_group); -+ } -+ -+ if (machine_is_neo1973_gta02()) { -+ regulator_put(neo1973_gps.regulator[GTA02_GPS_REG_RF_3V]); -+ sysfs_remove_group(&pdev->dev.kobj, >a02_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(>a01_pm_gps_driver); -+} -+ -+static void gta01_pm_gps_exit(void) -+{ -+ platform_driver_unregister(>a01_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, >a01_gsm_attr_group); -+} -+ -+static int gta01_gsm_remove(struct platform_device *pdev) -+{ -+ sysfs_remove_group(&pdev->dev.kobj, >a01_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(>a01_gsm_driver); -+} -+ -+static void gta01_gsm_exit(void) -+{ -+ platform_driver_unregister(>a01_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 *)¶m, 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 *)¶m, -+ 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 *)¶m, -+ 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 *)¶m, -+ 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, ¶m); -+ 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, ¶m); -+ 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, ¶m); -+ 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], ¶m, 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, ¶m); -+ -+ 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(®s,&pDev->IrqEnableRegisters,AR6K_IRQ_ENABLE_REGS_SIZE); -+ -+ UNLOCK_AR6K(pDev); -+ -+ /* always synchronous */ -+ status = HIFReadWrite(pDev->HIFDevice, -+ INT_STATUS_ENABLE_ADDRESS, -+ ®s.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(®s,&pDev->IrqEnableRegisters,AR6K_IRQ_ENABLE_REGS_SIZE); -+ -+ UNLOCK_AR6K(pDev); -+ -+ /* always synchronous */ -+ return HIFReadWrite(pDev->HIFDevice, -+ INT_STATUS_ENABLE_ADDRESS, -+ ®s.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(®s,&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,®s,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, -+ ®s.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, ®DumpArea); -+ -+ 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 *)®DumpValues[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(>a01_pm_bt_dev); -+ break; -+ } -+ platform_device_register(>a01_pm_gps_dev); -+ /* a link for gllin compatibility */ -+ err = bus_create_device_link(&platform_bus_type, -+ >a01_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(>a01kbd->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(>a01kbd_driver); -+} -+ -+static void __exit gta01kbd_exit(void) -+{ -+ platform_driver_unregister(>a01kbd_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(>a02led_driver); -+} -+ -+static void __exit gta02led_exit(void) -+{ -+ platform_driver_unregister(>a02led_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(®_resp[n]); -+ else -+ for (n = 0; n < 3; n++) /* super mangle power 2 */ -+ pu16[n] = (readw(®_resp[n]) >> 8) | -+ (readw(®_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 (®s, &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, >a01_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(>a01_battery_driver); -+} -+ -+static void __exit gta01_battery_exit(void) -+{ -+ platform_driver_unregister(>a01_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(®ulator->rdev->mutex); -+ regulator->enabled = 0; -+ regulator->uA_load = 0; -+ ret = _regulator_disable(regulator->rdev); -+ mutex_unlock(®ulator->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(®ulators[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(>a01bl.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, >a01bl.pwm); -+ s3c2410_gpio_cfgpin(GTA01_GPIO_BACKLIGHT, S3C2410_GPB0_TOUT0); -+ } -+#endif -+ mutex_unlock(>a01bl.mutex); -+ -+ gta01bl.intensity = intensity; -+ return 0; -+} -+ -+static int gta01bl_init_hw(void) -+{ -+ int rc; -+ -+ rc = s3c2410_pwm_init(>a01bl.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(>a01bl.pwm); -+ if (rc) -+ return rc; -+ -+ s3c2410_pwm_start(>a01bl.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(>a01bl.mutex); -+ gta01bl_init_hw(); -+ mutex_unlock(>a01bl.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(>a01bl.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, -+ >a01bl_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(>a01_backlight_device->props, -+ >a01bl_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(>a01bl.pwm); -+#endif -+ backlight_device_unregister(gta01_backlight_device); -+ mutex_destroy(>a01bl.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(>a01bl_driver); -+} -+ -+static void __exit gta01bl_exit(void) -+{ -+ platform_driver_unregister(>a01bl_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/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/020-rename-serialdevs.patch b/target/linux/s3c24xx/patches-2.6.29/020-rename-serialdevs.patch deleted file mode 100644 index 3e6fdbea92..0000000000 --- a/target/linux/s3c24xx/patches-2.6.29/020-rename-serialdevs.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/drivers/serial/samsung.c -+++ b/drivers/serial/samsung.c -@@ -882,7 +882,7 @@ static struct uart_ops s3c24xx_serial_op - - static struct uart_driver s3c24xx_uart_drv = { - .owner = THIS_MODULE, -- .dev_name = "s3c2410_serial", -+ .dev_name = "ttySAC", - .nr = CONFIG_SERIAL_SAMSUNG_UARTS, - .cons = S3C24XX_SERIAL_CONSOLE, - .driver_name = S3C24XX_SERIAL_NAME, diff --git a/target/linux/s3c24xx/patches-2.6.29/050-dont-override-logo-with-early-printks.patch b/target/linux/s3c24xx/patches-2.6.29/050-dont-override-logo-with-early-printks.patch deleted file mode 100644 index 3aa1a0be5a..0000000000 --- a/target/linux/s3c24xx/patches-2.6.29/050-dont-override-logo-with-early-printks.patch +++ /dev/null @@ -1,79 +0,0 @@ -diff -ruN linux-2.6.29.orig/drivers/video/console/fbcon.c linux-2.6.29/drivers/video/console/fbcon.c ---- linux-2.6.29.orig/drivers/video/console/fbcon.c 2009-05-14 22:21:12.000000000 +0200 -+++ linux-2.6.29/drivers/video/console/fbcon.c 2009-05-15 01:45:36.000000000 +0200 -@@ -562,7 +562,7 @@ - /* Need to make room for the logo */ - struct fbcon_ops *ops = info->fbcon_par; - int cnt, erase = vc->vc_video_erase_char, step; -- unsigned short *save = NULL, *r, *q; -+ unsigned short *r, *q; - int logo_height; - - if (info->flags & FBINFO_MODULE) { -@@ -581,37 +581,18 @@ - q = (unsigned short *) (vc->vc_origin + - vc->vc_size_row * rows); - step = logo_lines * cols; -- for (r = q - logo_lines * cols; r < q; r++) -- if (scr_readw(r) != vc->vc_video_erase_char) -- break; -- if (r != q && new_rows >= rows + logo_lines) { -- save = kmalloc(logo_lines * new_cols * 2, GFP_KERNEL); -- if (save) { -- int i = cols < new_cols ? cols : new_cols; -- scr_memsetw(save, erase, logo_lines * new_cols * 2); -- r = q - step; -- for (cnt = 0; cnt < logo_lines; cnt++, r += i) -- scr_memcpyw(save + cnt * new_cols, r, 2 * i); -- r = q; -- } -- } -- if (r == q) { -- /* We can scroll screen down */ -- r = q - step - cols; -- for (cnt = rows - logo_lines; cnt > 0; cnt--) { -- scr_memcpyw(r + step, r, vc->vc_size_row); -- r -= cols; -- } -- if (!save) { -- int lines; -- if (vc->vc_y + logo_lines >= rows) -- lines = rows - vc->vc_y - 1; -- else -- lines = logo_lines; -- vc->vc_y += lines; -- vc->vc_pos += lines * vc->vc_size_row; -- } -- } -+ r = q - step - cols; -+ for (cnt = rows - logo_lines; cnt > 0; cnt--) { -+ scr_memcpyw(r + step, r, vc->vc_size_row); -+ r -= cols; -+ } -+ int lines; -+ if (vc->vc_y + logo_lines >= rows) -+ lines = rows - vc->vc_y - 1; -+ else -+ lines = logo_lines; -+ vc->vc_y += lines; -+ vc->vc_pos += lines * vc->vc_size_row; - scr_memsetw((unsigned short *) vc->vc_origin, - erase, - vc->vc_size_row * logo_lines); -@@ -621,16 +602,6 @@ - update_screen(vc); - } - -- if (save) { -- q = (unsigned short *) (vc->vc_origin + -- vc->vc_size_row * -- rows); -- scr_memcpyw(q, save, logo_lines * new_cols * 2); -- vc->vc_y += logo_lines; -- vc->vc_pos += logo_lines * vc->vc_size_row; -- kfree(save); -- } -- - if (logo_lines > vc->vc_bottom) { - logo_shown = FBCON_LOGO_CANSHOW; - printk(KERN_INFO diff --git a/target/linux/s3c24xx/patches-2.6.29/051-add-openwrt-logo.patch b/target/linux/s3c24xx/patches-2.6.29/051-add-openwrt-logo.patch deleted file mode 100644 index 87f62fd238..0000000000 --- a/target/linux/s3c24xx/patches-2.6.29/051-add-openwrt-logo.patch +++ /dev/null @@ -1,38452 +0,0 @@ -diff -ruN linux-2.6.29.orig/drivers/video/logo/Kconfig linux-2.6.29/drivers/video/logo/Kconfig ---- linux-2.6.29.orig/drivers/video/logo/Kconfig 2009-05-14 22:21:12.000000000 +0200 -+++ linux-2.6.29/drivers/video/logo/Kconfig 2009-05-14 22:28:50.000000000 +0200 -@@ -82,4 +82,8 @@ - depends on M32R - default y - -+config LOGO_OPENWRT_CLUT224 -+ bool "224-color OpenWrt Linux logo" -+ default y -+ - endif # LOGO -diff -ruN linux-2.6.29.orig/drivers/video/logo/logo.c linux-2.6.29/drivers/video/logo/logo.c ---- linux-2.6.29.orig/drivers/video/logo/logo.c 2009-05-14 22:21:12.000000000 +0200 -+++ linux-2.6.29/drivers/video/logo/logo.c 2009-05-14 22:37:05.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_openwrt_clut224; - - static int nologo; - module_param(nologo, bool, 0); -@@ -115,6 +116,10 @@ - /* M32R Linux logo */ - logo = &logo_m32r_clut224; - #endif -+#ifdef CONFIG_LOGO_OPENWRT_CLUT224 -+ /* OpenWrt logo */ -+ logo = &logo_openwrt_clut224; -+#endif - } - return logo; - } -diff -ruN linux-2.6.29.orig/drivers/video/logo/logo_openwrt_clut224.ppm linux-2.6.29/drivers/video/logo/logo_openwrt_clut224.ppm ---- linux-2.6.29.orig/drivers/video/logo/logo_openwrt_clut224.ppm 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.29/drivers/video/logo/logo_openwrt_clut224.ppm 2009-05-15 09:54:13.000000000 +0200 -@@ -0,0 +1,38403 @@ -+P3 -+480 480 -+255 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+69 83 130 70 84 131 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 70 85 132 70 85 132 -+71 85 132 72 84 131 72 85 132 70 84 131 42 58 112 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 34 50 107 67 81 129 -+73 86 133 73 86 133 73 86 133 73 86 133 72 85 132 72 85 132 -+73 86 133 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 73 86 134 74 87 134 74 87 134 74 87 134 74 87 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 74 87 134 74 87 134 -+73 86 134 73 86 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 73 86 133 73 86 133 72 85 132 73 86 133 -+73 86 133 73 86 133 73 86 134 51 66 119 25 42 101 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 25 43 102 61 75 125 72 85 132 -+72 85 132 72 84 131 71 85 132 70 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+70 84 131 69 83 130 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 69 83 131 68 82 130 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 68 82 130 67 81 129 67 81 129 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 67 80 128 35 51 108 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 27 44 103 -+65 79 128 66 80 129 65 79 128 66 80 129 66 80 128 66 80 127 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+65 79 128 64 78 128 64 78 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 64 78 127 63 77 126 63 77 126 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+63 77 126 63 77 126 48 64 116 23 40 99 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+44 59 113 62 76 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 58 73 123 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 57 72 122 -+58 73 123 58 73 123 58 73 123 57 72 122 44 60 114 23 40 99 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 34 50 107 -+57 72 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 55 70 121 54 70 120 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 53 68 119 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 30 46 104 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 26 43 102 43 58 114 51 66 119 49 64 117 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 47 63 116 37 53 109 23 40 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 44 59 113 46 61 115 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 40 57 112 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 27 44 102 38 54 110 -+40 56 111 40 56 111 39 55 111 38 54 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 38 54 110 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 69 83 130 -+70 84 131 71 85 132 70 84 131 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 70 85 132 71 85 132 -+72 84 131 72 85 132 70 83 130 43 58 114 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 25 42 101 44 59 113 71 84 131 73 86 133 -+72 85 132 73 86 133 73 86 133 72 85 132 73 86 133 73 86 133 -+74 87 134 73 86 133 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 73 86 134 -+73 86 134 74 87 134 74 87 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+74 87 133 74 87 133 74 87 133 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 74 87 134 75 88 134 74 87 134 -+74 87 134 73 86 134 73 86 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 73 86 133 74 87 134 73 86 133 73 86 133 72 85 132 -+73 86 133 73 86 133 72 85 132 74 87 134 61 75 125 32 50 106 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 26 43 101 57 72 122 -+72 85 132 72 85 132 71 85 132 71 85 132 70 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 70 84 131 -+71 85 132 70 84 131 69 83 130 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 69 83 131 69 83 131 69 83 131 -+68 82 130 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+68 82 130 69 83 131 68 82 130 67 81 129 68 82 130 68 82 130 -+68 82 130 68 82 130 67 81 129 69 83 130 59 74 124 26 43 102 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+43 59 113 68 81 130 66 80 129 66 80 129 66 80 128 66 80 128 -+66 80 127 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 65 79 128 64 78 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 64 78 127 65 79 128 64 78 127 63 77 126 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+63 77 126 62 76 125 58 73 123 30 46 104 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+31 47 105 59 74 124 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 59 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 59 74 124 58 73 123 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 -+57 72 122 58 73 123 58 73 123 58 73 123 53 68 119 26 43 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 100 25 42 101 -+55 69 121 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+55 70 121 56 70 122 54 70 120 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 54 69 120 53 68 119 54 69 120 -+54 69 120 54 69 120 53 68 119 55 70 121 38 54 109 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 38 54 110 51 66 119 49 64 117 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 48 63 117 42 58 112 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 39 55 110 46 61 115 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 25 42 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 26 43 102 36 52 108 -+40 56 111 40 56 111 39 55 111 39 55 111 38 54 111 39 55 111 -+39 55 111 39 55 111 39 55 111 38 54 110 26 44 102 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 69 83 130 -+70 84 131 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 70 85 132 71 85 132 72 84 131 -+72 85 132 72 85 132 40 56 111 23 40 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 54 69 120 72 85 132 73 86 133 72 85 132 -+73 86 133 72 85 132 72 85 132 73 86 133 74 87 134 74 87 134 -+73 86 133 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 73 86 134 74 87 134 -+74 87 134 75 88 134 75 88 134 74 87 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 74 87 133 74 87 133 74 87 133 -+74 87 133 74 87 133 74 87 133 74 87 133 74 87 133 74 87 133 -+75 88 134 75 88 134 75 88 134 74 87 133 74 87 133 74 87 133 -+74 87 133 74 87 133 74 87 133 74 87 133 74 87 133 74 87 133 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 74 87 134 75 88 134 -+75 88 134 74 87 134 74 87 134 73 86 134 73 86 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 73 86 133 74 87 134 73 86 133 72 85 132 -+72 85 132 73 86 133 73 86 133 72 85 132 73 86 133 67 80 128 -+38 54 109 23 40 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 27 44 102 -+58 73 123 72 85 132 71 84 131 71 85 132 71 85 132 70 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+70 84 131 71 85 132 69 83 130 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 69 83 131 -+69 83 131 68 82 130 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 68 82 130 67 81 129 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 67 81 129 69 83 131 46 61 115 -+23 39 99 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+28 45 103 59 74 124 66 80 129 65 79 128 66 80 129 66 80 128 -+66 80 127 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 65 79 128 65 79 128 64 78 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 63 77 126 -+64 78 127 63 77 126 62 76 125 42 58 112 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+27 44 102 50 65 118 61 75 125 59 74 124 61 75 125 61 75 125 -+61 75 125 60 75 125 59 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 59 74 124 60 75 125 58 73 123 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 59 74 124 -+57 72 122 58 73 123 58 73 123 58 73 123 56 71 121 34 50 107 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+44 60 115 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 55 70 121 54 70 120 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 54 69 120 55 70 121 53 68 119 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 47 63 116 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 34 50 107 50 65 118 50 65 118 -+49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 48 63 117 44 60 114 27 44 102 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 34 50 107 46 61 115 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+44 60 114 44 60 114 44 60 114 43 59 113 44 60 114 29 45 103 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 34 50 107 -+40 56 111 39 55 111 40 56 111 39 55 111 38 54 111 39 55 111 -+39 55 111 39 55 111 39 55 111 38 54 110 29 45 103 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+70 84 131 70 84 131 70 84 131 70 84 131 69 83 130 70 84 131 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 70 85 132 71 85 132 72 84 131 72 85 132 -+73 85 132 38 54 110 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+27 44 102 63 77 126 72 85 132 73 86 133 72 85 132 73 86 133 -+72 85 132 73 86 133 73 86 133 74 87 134 73 86 133 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 73 86 134 73 86 134 74 87 134 74 87 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 74 87 133 -+74 87 133 74 87 133 74 87 133 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+76 89 135 76 89 135 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+74 87 133 74 87 133 74 87 133 74 87 133 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+74 87 134 75 88 134 74 87 134 74 87 134 74 87 134 73 86 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 73 86 133 74 87 134 73 86 133 -+73 86 133 72 85 132 73 86 133 73 86 133 73 86 133 73 86 133 -+72 85 132 42 58 112 23 40 99 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+26 43 101 62 76 125 72 85 132 71 84 131 72 85 132 70 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 70 84 131 69 83 130 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 69 83 131 70 84 131 -+69 83 131 68 82 130 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 68 82 130 69 83 131 68 82 130 67 81 129 68 82 130 -+68 82 130 68 82 130 68 82 130 67 81 129 68 82 130 67 81 129 -+31 47 105 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 43 58 114 66 80 128 66 80 129 66 80 129 66 80 129 -+66 80 128 66 80 127 66 80 128 66 80 128 66 80 128 66 80 128 -+65 79 128 66 80 128 65 79 128 64 78 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 64 78 127 65 79 128 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 62 76 125 63 77 126 53 67 120 27 44 102 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 40 56 111 61 75 125 61 75 125 61 75 125 61 75 125 -+60 75 125 61 75 125 59 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 58 73 123 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 -+57 72 122 58 73 123 58 73 123 58 73 123 58 73 123 42 58 112 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+36 52 108 57 72 122 55 69 121 56 70 122 56 70 122 56 70 122 -+56 70 122 55 70 121 54 70 120 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 54 69 120 53 68 119 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 55 70 121 25 42 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 29 45 103 48 63 117 50 65 118 -+49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 49 65 117 48 65 116 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 48 63 117 46 61 115 29 47 104 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 29 47 104 46 61 115 45 60 114 44 59 113 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 34 50 107 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 33 49 106 -+40 56 111 40 56 111 40 56 111 39 55 111 38 54 111 39 55 111 -+39 55 111 39 55 111 39 55 111 38 54 110 31 47 105 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+70 84 131 70 84 131 70 84 131 69 83 130 70 84 131 71 85 132 -+70 84 131 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 70 85 132 71 85 132 72 85 132 72 85 132 71 84 131 -+43 59 113 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 29 47 104 -+63 77 126 73 86 133 72 85 132 73 86 133 73 86 133 72 85 132 -+73 86 133 74 87 134 73 86 133 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+73 86 134 73 86 134 74 87 134 75 88 134 74 87 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 74 87 133 -+74 87 133 74 87 133 75 88 134 75 88 134 75 88 134 75 88 134 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 75 88 134 76 89 135 -+76 89 135 76 89 135 76 89 135 75 88 134 75 88 134 75 88 134 -+75 88 134 74 87 133 74 87 133 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 74 87 134 75 88 134 75 88 134 -+74 87 134 74 87 134 73 86 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 73 86 133 72 85 132 72 85 132 73 86 133 72 85 132 -+72 85 132 74 87 134 48 63 117 24 41 100 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 25 42 101 63 77 126 72 85 132 72 85 132 72 84 131 -+71 85 132 70 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 70 84 131 69 83 130 69 83 130 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 69 83 131 -+70 84 131 69 83 131 68 82 130 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 68 82 130 67 81 129 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+56 71 121 23 40 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 29 46 103 59 74 124 66 80 129 66 80 129 66 80 129 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 65 79 128 66 80 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 64 78 127 -+63 77 126 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+63 77 126 64 78 127 63 77 126 63 77 126 33 49 106 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 32 48 105 57 72 122 61 75 125 61 75 125 61 75 125 -+61 75 125 60 75 125 60 75 125 59 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 59 74 124 59 74 124 58 73 123 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+58 73 123 57 72 122 58 73 123 58 73 123 58 73 123 49 64 117 -+27 44 102 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+30 46 104 55 69 121 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 55 70 121 54 70 120 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 53 68 119 -+54 69 120 54 69 120 54 69 120 54 69 120 55 70 121 34 50 107 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 47 63 116 50 65 118 -+49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 49 65 117 48 65 116 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 48 64 117 49 65 117 48 63 117 34 50 107 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 29 45 103 44 60 114 46 61 115 44 59 113 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 -+45 60 114 43 60 114 44 60 114 44 60 114 44 60 114 38 54 109 -+23 40 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 31 47 105 -+39 55 110 40 56 111 40 56 111 39 55 111 38 54 111 39 55 111 -+39 55 111 39 55 111 39 55 111 38 54 110 34 50 107 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+70 84 131 70 84 131 70 84 131 69 83 130 71 85 132 70 84 131 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+70 85 132 71 85 132 71 85 132 71 84 131 72 85 132 49 64 117 -+24 41 101 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 23 40 100 33 49 106 63 77 126 -+74 87 134 73 86 133 73 86 133 73 86 133 72 85 132 73 86 133 -+74 87 134 73 86 133 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 73 86 134 73 86 134 -+74 87 134 74 87 134 75 88 134 74 87 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 74 87 133 74 87 133 75 88 134 -+75 88 134 75 88 134 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 75 88 134 76 89 135 76 89 135 76 89 135 -+75 88 134 75 88 134 75 88 134 74 87 133 74 87 133 74 87 133 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 74 87 134 -+75 88 134 74 87 134 74 87 134 73 86 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+73 86 133 74 87 134 73 86 133 72 85 132 72 85 132 73 86 133 -+73 86 133 72 85 132 73 86 133 51 66 119 26 43 102 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 29 45 103 63 77 126 72 85 132 72 85 132 -+71 85 132 70 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 70 84 131 71 85 132 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+69 83 131 70 84 131 68 82 130 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 68 82 130 68 82 130 68 82 130 -+67 81 129 68 82 130 68 82 130 68 82 130 68 82 130 67 81 129 -+66 80 128 38 54 110 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 23 40 99 45 60 114 66 80 129 65 79 128 66 80 128 -+66 80 129 66 80 127 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 65 79 128 64 78 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 64 78 127 65 79 128 -+63 77 126 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 63 77 126 64 78 127 46 61 115 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 51 66 119 59 74 124 61 75 125 61 75 125 -+61 75 125 61 75 125 60 75 125 59 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 58 73 123 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+58 73 123 57 72 122 58 73 123 58 73 123 58 73 123 56 71 121 -+30 46 104 25 42 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+27 44 102 48 63 117 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 55 70 121 54 70 120 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 53 68 119 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 43 59 113 -+23 40 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 23 40 99 42 57 112 51 66 119 -+50 65 118 49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 49 65 117 48 65 116 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 48 64 116 48 64 117 37 53 109 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 27 44 102 42 57 112 46 61 115 44 59 113 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 43 60 114 44 60 114 44 60 114 44 60 114 42 58 112 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 29 45 103 -+39 55 110 40 56 111 40 56 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 35 51 108 25 42 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+70 84 131 70 84 131 69 83 130 70 84 131 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+70 85 132 71 85 132 71 84 131 73 86 133 53 67 120 25 42 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 23 39 99 35 51 108 66 80 128 74 87 134 -+72 85 132 72 85 132 72 85 132 72 85 132 73 86 133 74 87 134 -+73 86 133 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 73 86 134 74 87 134 74 87 134 -+75 88 134 75 88 134 74 87 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 74 87 133 74 87 133 75 88 134 75 88 134 75 88 134 -+76 89 135 76 89 135 75 88 134 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 75 88 134 -+76 89 135 76 89 135 75 88 134 75 88 134 75 88 134 74 87 133 -+74 87 133 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+74 87 134 75 88 134 74 87 134 74 87 134 73 86 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 73 86 133 74 87 134 73 86 133 73 86 133 72 85 132 -+73 86 133 73 86 133 73 86 133 73 86 133 54 69 120 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 33 49 106 66 80 128 72 85 132 -+71 85 132 71 85 132 70 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 70 84 131 71 85 132 69 83 130 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 69 83 131 68 82 130 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 68 82 130 -+67 81 129 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 56 71 121 27 44 102 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 26 43 101 62 76 125 66 80 129 66 80 129 -+66 80 129 66 80 128 66 80 127 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 65 79 128 66 80 128 64 78 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+64 78 127 63 77 126 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 63 77 126 63 77 126 63 77 126 61 75 125 26 43 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 23 40 100 40 56 111 59 74 124 61 75 125 61 75 125 -+61 75 125 61 75 125 60 75 125 60 75 125 59 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 59 74 124 -+58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+58 73 123 58 73 123 57 72 122 58 73 123 57 72 122 59 74 124 -+36 52 108 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 101 42 58 112 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 55 70 121 54 70 120 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 53 68 119 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 51 67 118 -+23 40 99 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 35 51 108 51 66 119 -+50 65 118 49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 49 65 117 49 65 117 48 65 116 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 48 64 117 48 64 117 40 57 112 -+26 43 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 25 42 101 39 55 110 46 61 115 44 59 113 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 43 60 114 44 60 114 44 60 114 43 59 113 43 59 113 -+26 43 102 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 26 43 102 -+38 54 110 40 56 111 39 55 111 40 56 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 36 52 108 26 43 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+70 84 131 69 83 130 70 84 131 71 85 132 70 84 131 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 70 85 132 -+71 85 132 71 84 131 73 86 133 58 73 123 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 23 40 100 36 52 108 68 82 130 73 86 133 72 85 132 -+73 86 133 73 86 133 73 86 133 73 86 133 73 86 133 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 73 86 134 74 87 134 75 88 134 75 88 134 -+74 87 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 74 87 133 -+74 87 133 75 88 134 75 88 134 76 89 135 76 89 135 76 89 135 -+75 88 134 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 75 88 134 -+75 88 134 74 87 133 74 87 133 74 87 133 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 74 87 134 75 88 134 75 88 134 74 87 134 73 86 134 -+73 86 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 73 86 133 74 87 134 74 87 134 73 86 133 -+72 85 132 73 86 133 72 85 132 73 86 133 73 86 133 57 72 122 -+23 40 99 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 37 53 109 72 85 132 -+71 84 131 72 85 132 71 85 132 70 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 70 84 131 -+69 83 130 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 69 83 131 70 84 131 69 83 131 68 82 130 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+68 82 130 67 81 129 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 37 53 109 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 23 40 100 42 58 112 68 81 130 65 79 128 -+66 80 128 66 80 129 66 80 127 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 65 79 128 64 78 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 64 78 127 -+64 78 127 63 77 126 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 63 77 126 62 76 125 64 78 127 39 55 110 -+23 40 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 26 43 102 61 75 125 59 74 124 61 75 125 -+61 75 125 61 75 125 61 75 125 60 75 125 59 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 -+58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 -+59 74 124 58 73 123 57 72 122 58 73 123 57 72 122 58 73 123 -+47 63 116 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 36 52 108 55 69 121 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 55 70 121 54 70 120 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 -+53 68 119 54 69 120 54 69 120 54 69 120 53 68 119 53 68 119 -+29 46 104 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 28 45 103 51 66 119 -+50 65 118 49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 49 65 117 48 65 116 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 48 64 117 48 64 117 44 61 114 -+27 44 102 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 37 53 109 46 61 115 45 60 114 -+44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 43 60 114 44 60 114 44 60 114 44 60 114 43 59 113 -+30 46 104 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 101 -+38 54 109 39 55 110 40 56 111 40 56 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 37 53 109 27 44 102 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+69 83 130 70 84 131 71 85 132 70 84 131 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 70 85 132 71 85 132 -+72 85 132 72 85 132 63 77 126 27 43 102 25 42 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 34 50 107 67 81 129 73 86 133 73 86 133 73 86 133 -+72 85 132 73 86 133 74 87 134 73 86 133 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+73 86 134 74 87 134 75 88 134 75 88 134 74 87 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 74 87 133 75 88 134 75 88 134 75 88 134 -+76 89 135 76 89 135 75 88 134 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 75 88 134 75 88 134 74 87 133 -+74 87 133 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+74 87 134 73 86 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 73 86 133 74 87 134 -+73 86 133 72 85 132 73 86 133 73 86 133 72 85 132 73 86 133 -+57 72 122 24 41 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 23 40 99 43 59 113 -+72 85 132 72 85 132 72 84 131 71 85 132 70 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 70 84 131 -+70 84 131 69 83 130 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 69 83 131 68 82 130 68 82 130 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+68 82 130 67 81 129 68 82 130 68 82 130 68 82 130 68 82 130 -+67 81 129 68 82 130 59 74 124 25 42 101 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 101 63 77 126 66 80 129 -+65 79 128 66 80 128 66 80 128 66 80 127 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 65 79 128 64 78 128 -+64 78 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 64 78 127 63 77 126 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 63 77 126 63 77 126 57 72 122 -+23 40 99 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 23 40 99 50 65 118 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 60 75 125 59 75 125 59 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 -+58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 58 73 123 57 72 122 58 73 123 58 73 123 58 73 123 -+58 73 123 25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 31 47 105 53 67 120 55 69 121 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 55 70 121 54 70 120 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 -+53 68 119 54 69 120 54 69 120 54 69 120 54 69 120 53 68 119 -+37 53 109 23 40 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 23 40 99 49 64 117 -+50 65 118 49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 49 65 117 48 65 116 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 48 64 117 -+28 45 103 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 34 50 106 45 60 114 45 60 114 -+44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 44 60 114 43 60 114 44 60 114 44 60 114 43 59 113 -+33 49 106 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+36 52 108 40 56 111 40 56 111 40 56 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 38 54 110 28 45 103 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+69 83 130 70 84 131 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 70 85 132 71 85 132 71 85 132 -+72 85 132 67 80 128 34 50 106 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+33 49 106 65 79 128 74 87 133 72 85 132 73 86 133 72 85 132 -+73 86 133 74 87 134 73 86 133 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 73 86 134 73 86 134 -+74 87 134 75 88 134 74 87 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 74 87 133 75 88 134 75 88 134 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 88 135 76 88 135 76 88 135 76 88 135 76 88 135 -+76 88 135 76 88 135 76 88 135 76 88 135 76 88 135 76 88 135 -+76 88 135 76 88 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 75 88 134 76 89 135 75 88 134 75 88 134 -+75 88 134 74 87 133 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 74 87 134 -+75 88 134 74 87 134 73 86 134 73 86 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 73 86 133 -+74 87 134 73 86 133 72 85 132 73 86 133 73 86 133 72 85 132 -+73 86 133 53 67 120 25 42 101 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 23 40 99 -+50 65 118 72 85 132 72 85 132 72 84 131 70 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+70 84 131 70 84 131 69 83 130 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 69 83 131 70 84 131 69 83 131 68 82 130 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 68 82 130 -+69 83 131 68 82 130 67 81 129 68 82 130 68 82 130 68 82 130 -+68 82 130 67 81 129 71 85 132 40 56 111 23 40 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 42 57 112 68 81 130 -+66 80 129 66 80 129 66 80 128 66 80 128 66 80 127 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 65 79 128 -+64 78 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 64 78 127 63 77 126 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 63 77 126 63 77 126 63 77 126 -+32 50 106 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 34 50 107 63 77 126 59 74 124 -+61 75 125 61 75 125 60 75 125 61 75 125 60 75 125 59 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 60 75 125 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+58 73 123 59 74 124 58 73 123 58 73 123 58 73 123 57 72 122 -+59 74 124 34 50 107 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 50 65 118 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 -+53 68 119 54 69 120 54 69 120 54 69 120 54 69 120 53 68 119 -+44 59 113 23 40 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 23 40 100 42 58 112 -+51 66 119 50 65 118 49 64 117 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 49 65 117 48 65 116 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 48 64 116 49 65 117 -+32 50 106 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 31 47 105 44 60 114 45 60 114 -+44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+44 60 114 45 60 114 43 60 114 44 60 114 44 60 114 43 59 113 -+37 53 109 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+33 49 106 40 56 111 40 56 111 40 56 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 29 46 104 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+70 84 131 71 85 132 70 84 131 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 70 85 132 71 85 132 71 85 132 71 84 131 -+71 84 131 42 57 112 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 23 40 100 29 47 104 -+65 79 128 74 87 133 72 85 132 73 86 133 72 85 132 73 86 133 -+73 86 133 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 73 86 134 74 87 134 -+74 87 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 74 87 133 -+74 87 133 75 88 134 76 89 135 76 89 135 75 88 134 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 88 135 76 88 135 76 88 135 76 88 135 -+76 88 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 88 135 76 88 135 76 88 135 76 88 135 76 88 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+75 88 134 75 88 134 74 87 133 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+74 87 134 75 88 134 74 87 134 74 87 134 73 86 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+73 86 133 74 87 134 73 86 133 72 85 132 73 86 133 73 86 133 -+73 86 133 72 85 132 49 64 117 23 40 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+26 43 102 57 72 122 73 85 132 72 84 131 71 85 132 70 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 70 84 131 70 84 131 69 83 130 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 69 83 131 68 82 130 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+68 82 130 69 83 131 67 81 129 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 64 78 127 25 42 101 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 101 29 46 104 61 75 125 -+66 80 129 65 79 128 66 80 129 66 80 128 66 80 127 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 65 79 128 -+64 78 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 64 78 127 64 78 127 63 77 126 64 78 127 64 78 127 -+64 78 127 64 78 127 63 77 126 64 78 127 63 77 126 63 77 126 -+49 64 117 23 40 99 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 25 42 101 58 73 123 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 60 75 125 59 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 58 73 123 58 73 123 58 73 123 58 73 123 -+58 73 123 46 61 115 23 40 99 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 23 40 99 44 59 113 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 55 70 121 56 70 122 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+48 64 116 25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 36 52 108 -+52 67 118 50 65 118 49 64 117 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 49 65 117 49 65 117 48 65 116 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 48 64 117 -+37 53 109 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 27 44 103 44 59 113 45 60 114 -+44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 44 60 114 43 60 114 44 60 114 44 60 114 44 60 114 -+39 55 110 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+29 47 104 40 56 111 40 56 111 40 56 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 38 54 110 39 55 111 31 47 105 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+71 85 132 70 84 131 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 72 85 132 71 84 131 73 85 132 -+52 67 118 23 40 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 27 44 102 65 79 128 -+73 86 133 72 85 132 73 86 133 73 86 133 73 86 133 74 87 134 -+74 87 134 73 86 133 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 73 86 134 74 87 134 75 88 134 -+75 88 134 74 87 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 74 87 133 75 88 134 -+75 88 134 76 89 135 75 88 134 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 88 135 -+76 88 135 76 88 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 88 135 76 88 135 76 88 135 76 88 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 75 88 134 -+76 89 135 76 89 135 75 88 134 74 87 133 74 87 133 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 74 87 134 75 88 134 75 88 134 74 87 134 73 86 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 73 86 133 74 87 134 73 86 133 72 85 132 73 86 133 -+72 85 132 73 86 133 73 86 133 45 60 114 23 40 99 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 31 47 105 65 79 128 72 85 132 72 85 132 71 85 132 -+70 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+70 84 131 71 85 132 70 84 131 69 83 130 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 69 83 131 70 84 131 69 83 131 -+68 82 130 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 68 82 130 67 81 129 68 82 130 68 82 130 -+68 82 130 68 82 130 67 81 129 68 82 130 46 61 115 23 40 99 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 47 63 116 -+66 80 129 66 80 129 66 80 129 66 80 128 66 80 127 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+65 79 128 64 78 128 65 79 128 65 79 128 65 79 128 65 79 128 -+64 78 127 65 79 128 64 78 127 63 77 126 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 63 77 126 63 77 126 -+57 72 122 27 44 102 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 46 61 115 62 76 125 -+61 75 125 61 75 125 61 75 125 61 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 58 73 123 58 73 123 58 73 123 58 73 123 -+58 73 123 56 71 121 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 35 51 108 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 55 70 121 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+50 65 118 30 46 104 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 29 45 103 -+53 67 120 50 65 118 49 64 117 50 65 118 50 65 118 50 65 118 -+50 65 118 49 65 117 50 65 118 49 65 117 48 65 116 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 -+43 59 113 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 25 42 100 43 58 114 45 60 114 -+44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 44 60 114 43 60 114 44 60 114 44 60 114 44 60 114 -+40 56 111 26 43 102 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+28 45 103 40 56 111 40 56 111 40 56 111 39 55 111 38 54 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 33 49 106 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 70 85 132 71 85 132 72 84 131 72 85 132 63 77 126 -+23 40 99 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 26 43 102 59 74 124 73 86 133 -+72 85 132 73 86 133 72 85 132 73 86 133 74 87 134 73 86 133 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 73 86 134 73 86 134 74 87 134 74 87 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 74 87 133 74 87 133 75 88 134 76 89 135 76 89 135 -+75 88 134 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 88 135 76 88 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 90 135 76 90 135 76 90 135 76 89 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 89 135 -+76 90 135 76 90 135 76 90 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 88 135 76 88 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 75 88 134 75 88 134 -+74 87 133 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 74 87 134 75 88 134 74 87 134 -+73 86 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 73 86 133 74 87 134 73 86 133 72 85 132 -+73 86 133 73 86 133 72 85 132 74 87 134 39 55 111 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 23 40 99 40 57 112 70 84 131 72 85 132 72 84 131 -+71 85 132 70 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 70 84 131 71 85 132 70 84 131 69 83 130 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+69 83 131 68 82 130 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 68 82 130 67 81 129 67 81 129 68 82 130 -+68 82 130 68 82 130 68 82 130 67 81 129 63 77 126 27 44 102 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 35 52 107 -+63 77 126 66 80 129 66 80 128 66 80 129 66 80 128 66 80 127 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 63 77 126 64 78 127 63 77 126 -+61 75 125 37 53 109 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 34 50 107 62 76 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 58 73 123 59 74 124 57 72 122 58 73 123 58 73 123 -+57 72 122 57 72 122 32 50 106 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 26 43 102 55 70 121 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 55 70 121 54 70 120 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+52 67 118 34 50 107 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+50 65 118 50 65 118 49 64 117 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 49 65 117 48 65 116 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 -+47 63 116 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 23 40 100 40 56 111 46 61 115 -+45 60 114 44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 44 60 114 43 60 114 43 60 114 44 60 114 44 60 114 -+40 57 112 28 45 103 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+25 42 101 40 56 111 39 55 110 40 56 111 40 56 111 38 54 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 35 51 108 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+70 85 132 71 85 132 72 84 131 72 85 132 68 81 130 29 47 104 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 100 50 65 118 73 86 133 73 86 133 -+73 86 133 72 85 132 73 86 133 74 87 134 73 86 133 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+73 86 134 74 87 134 74 87 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+74 87 133 75 88 134 75 88 134 76 89 135 75 88 134 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 88 135 76 88 135 -+76 89 135 76 89 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 89 135 76 90 135 76 90 135 76 90 135 -+76 89 135 76 89 135 76 89 135 76 88 135 76 88 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 75 88 134 76 89 135 76 89 135 -+75 88 134 74 87 133 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 74 87 134 75 88 134 -+74 87 134 73 86 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 73 86 133 74 87 134 73 86 133 -+72 85 132 73 86 133 73 86 133 72 85 132 70 84 131 35 51 108 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 23 39 99 51 66 119 73 86 133 71 84 131 -+71 85 132 70 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 70 84 131 71 85 132 69 83 130 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 69 83 131 -+69 83 131 68 82 130 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 68 82 130 67 81 129 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 67 81 129 43 58 114 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 101 -+55 70 121 65 79 128 66 80 129 66 80 129 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 65 79 128 -+66 80 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 64 78 127 65 79 128 63 77 126 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 62 76 125 -+63 77 126 46 61 115 25 42 101 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 29 46 103 57 72 122 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 59 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 57 72 122 58 73 123 58 73 123 -+58 73 123 57 72 122 40 57 112 23 40 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 23 40 99 50 65 118 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 55 70 121 56 70 122 54 70 120 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+54 69 120 53 68 119 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 38 54 110 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+44 60 114 51 66 119 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 49 65 117 48 65 116 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 48 64 116 -+50 65 118 27 44 102 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 23 40 100 37 53 109 46 61 115 -+45 60 114 44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 44 60 114 43 60 114 44 60 114 44 60 114 -+43 59 113 29 47 104 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 39 55 110 40 56 111 40 56 111 40 56 111 38 54 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 37 53 109 -+26 43 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 70 85 132 -+71 85 132 72 85 132 72 85 132 71 84 131 42 58 112 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 23 40 99 44 59 113 73 86 133 73 86 133 72 85 132 -+73 86 133 72 85 132 73 86 133 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+73 86 134 74 87 134 75 88 134 74 87 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 74 87 133 -+74 87 133 75 88 134 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 88 135 76 88 135 76 89 135 76 89 135 -+76 89 135 76 90 135 76 89 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 89 135 -+76 90 135 76 90 135 76 89 135 76 89 135 76 89 135 76 88 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 75 88 134 -+76 89 135 75 88 134 74 87 133 74 87 133 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 74 87 134 -+75 88 134 74 87 134 73 86 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 73 86 133 74 87 134 -+73 86 133 72 85 132 73 86 133 72 85 132 73 86 133 64 78 127 -+29 46 104 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 25 42 101 61 75 125 73 86 133 -+72 84 131 71 85 132 70 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 70 84 131 69 83 130 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+69 83 131 69 83 131 68 82 130 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 68 82 130 68 82 130 67 81 129 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 57 72 122 -+27 44 103 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 23 40 99 -+39 55 111 65 79 128 65 79 128 66 80 128 66 80 129 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 64 78 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 64 78 127 63 77 126 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 63 77 126 -+63 77 126 55 69 121 28 45 103 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 26 43 102 49 64 117 -+61 75 125 59 74 124 61 75 125 61 75 125 61 75 125 60 75 125 -+59 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 59 74 124 58 73 123 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 58 73 123 57 72 122 58 73 123 -+58 73 123 57 72 122 49 65 117 23 40 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 23 40 100 40 57 112 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 54 70 120 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 -+55 70 121 53 68 119 54 69 120 54 69 120 54 69 120 53 68 119 -+54 69 120 43 59 113 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+39 55 111 51 66 119 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 -+48 64 117 34 50 106 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 32 50 106 46 61 115 -+45 60 114 44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 44 60 114 43 60 114 44 60 114 44 60 114 -+44 60 114 32 48 107 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 36 52 108 40 56 111 40 56 111 40 56 111 38 54 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 38 54 110 -+26 43 102 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 70 85 132 -+71 85 132 72 85 132 72 85 132 57 72 122 25 42 101 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+23 40 100 35 52 107 73 86 133 73 86 133 72 85 132 73 86 133 -+72 85 132 73 86 133 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 73 86 134 -+74 87 134 75 88 134 74 87 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 74 87 133 75 88 134 -+75 88 134 76 89 135 75 88 134 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 88 135 76 88 135 76 89 135 76 89 135 76 90 135 76 90 135 -+76 90 135 76 89 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 89 135 76 89 135 -+76 88 135 76 88 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 75 88 134 75 88 134 74 87 133 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 74 87 134 73 86 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 73 86 133 -+73 86 133 72 85 132 73 86 133 73 86 133 73 86 133 73 86 133 -+57 72 122 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 33 50 105 70 83 130 -+72 85 132 72 84 131 70 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 70 84 131 71 85 132 70 84 131 -+69 83 130 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 69 83 131 68 82 130 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 68 82 130 69 83 131 68 82 130 67 81 129 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+36 52 108 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 64 78 127 66 80 129 66 80 129 66 80 129 66 80 127 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 65 79 128 64 78 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 64 78 127 65 79 128 63 77 126 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 63 77 126 64 78 127 -+62 76 125 63 77 126 32 50 106 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 40 57 112 -+61 75 125 61 75 125 61 75 125 61 75 125 60 75 125 61 75 125 -+59 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+59 74 124 60 75 125 58 73 123 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 58 73 123 59 74 124 57 72 122 58 73 123 -+58 73 123 58 73 123 53 67 120 28 45 103 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 32 48 105 57 72 122 55 69 121 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 54 70 120 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 53 68 119 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 48 63 117 27 44 102 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+34 50 107 52 67 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 49 65 117 50 65 118 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+48 64 117 38 54 110 23 40 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 28 45 104 46 61 115 -+45 60 114 44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 44 60 114 43 60 114 44 60 114 44 60 113 -+44 60 114 34 50 107 24 41 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 34 50 106 40 56 111 40 56 111 40 56 111 38 54 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+27 44 102 24 41 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+71 85 132 71 85 132 71 85 132 71 85 132 70 85 132 71 85 132 -+72 84 131 72 85 132 68 81 130 32 50 106 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+28 45 103 68 82 130 73 86 133 73 86 133 73 86 133 72 85 132 -+73 86 133 74 87 134 73 86 133 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 73 86 134 73 86 134 74 87 134 -+74 87 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 74 87 133 74 87 133 75 88 134 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 88 135 76 88 135 76 89 135 -+76 89 135 76 90 135 76 90 135 76 89 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 89 135 -+76 90 135 76 89 135 76 89 135 76 88 135 76 88 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 75 88 134 76 89 135 75 88 134 74 87 133 -+74 87 133 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 74 87 134 75 88 134 74 87 134 73 86 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 73 86 133 72 85 132 72 85 132 73 86 133 72 85 132 -+75 88 134 46 61 115 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 47 63 116 -+72 85 132 72 85 132 71 85 132 70 85 132 70 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 70 84 131 -+69 83 130 69 83 130 70 84 131 70 84 131 70 84 131 70 84 131 -+69 83 131 70 84 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 68 82 130 69 83 131 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 67 81 129 69 83 130 -+54 69 120 25 42 101 25 42 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+23 40 99 46 61 115 67 81 129 65 79 128 66 80 128 66 80 129 -+66 80 127 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 64 78 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 64 78 127 63 77 126 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+63 77 126 64 78 127 43 59 113 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 34 50 107 -+58 73 123 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+60 75 125 59 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 58 73 123 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 58 73 123 57 72 122 58 73 123 -+58 73 123 58 73 123 56 71 121 34 50 107 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 25 42 101 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 55 70 121 -+54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 53 68 119 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 52 67 118 29 45 103 24 41 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+29 47 104 51 66 119 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+48 64 117 43 60 114 23 40 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 42 100 46 61 115 -+46 61 115 45 60 114 44 59 113 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 44 60 114 43 60 114 44 60 114 44 60 114 -+44 60 114 37 53 109 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 31 47 105 40 56 111 40 56 111 39 55 111 39 55 111 -+38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+28 45 104 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+71 85 132 71 85 132 71 85 132 71 85 132 70 85 132 71 85 132 -+72 84 131 73 86 133 45 60 114 23 39 99 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 26 43 101 -+57 72 122 73 86 133 72 85 132 73 86 133 72 85 132 73 86 133 -+74 87 134 73 86 133 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 73 86 134 74 87 134 74 87 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 74 87 133 74 87 133 75 88 134 76 89 135 75 88 134 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 88 135 76 89 135 76 89 135 76 90 135 -+76 90 135 76 89 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 89 135 76 90 135 76 90 135 76 89 135 76 89 135 76 88 135 -+76 88 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 75 88 134 75 88 134 75 88 134 -+75 88 134 74 87 133 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 74 87 134 75 88 134 74 87 134 73 86 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+73 86 133 74 87 134 73 86 133 72 85 132 73 86 133 73 86 133 -+72 85 132 74 87 133 38 54 110 23 40 99 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 28 45 103 -+62 76 125 71 84 131 72 85 132 71 85 132 70 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 70 84 131 71 85 132 -+70 84 131 69 83 130 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 69 83 131 70 84 131 68 82 130 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 68 82 130 -+67 81 129 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+69 83 130 31 47 105 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 27 44 103 66 80 129 66 80 129 66 80 129 66 80 129 -+66 80 128 66 80 127 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 65 79 128 64 78 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 64 78 127 64 78 127 63 77 126 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 63 77 126 -+63 77 126 63 77 126 56 71 121 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 27 43 102 -+55 70 121 61 75 125 61 75 125 61 75 125 61 75 125 60 75 125 -+60 75 125 59 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 59 74 124 58 73 123 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 58 73 123 58 73 123 57 72 122 -+58 73 123 58 73 123 58 73 123 40 56 111 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 49 64 117 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 55 70 121 56 70 122 -+54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 54 69 120 53 68 119 54 69 120 54 69 120 54 69 120 -+54 69 120 55 70 121 32 48 105 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+28 45 103 48 63 117 50 65 118 49 64 117 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+48 64 116 47 63 116 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 23 40 100 43 58 114 -+46 61 115 45 60 114 44 59 113 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 44 60 114 43 60 114 44 60 114 44 60 114 -+44 60 114 38 56 110 26 43 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 28 45 103 40 56 111 40 56 111 40 56 111 39 55 111 -+38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+31 47 105 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+71 85 132 71 85 132 71 85 132 70 85 132 71 85 132 72 84 131 -+73 86 133 58 73 123 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 44 59 113 -+72 85 132 73 86 133 73 86 133 72 85 132 73 86 133 74 87 134 -+73 86 133 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 73 86 134 74 87 134 75 88 134 74 87 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+74 87 133 75 88 134 75 88 134 76 89 135 75 88 134 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 88 135 76 89 135 76 89 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 89 135 76 90 135 76 89 135 76 89 135 -+76 89 135 76 88 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+75 88 134 74 87 133 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 74 87 134 75 88 134 74 87 134 -+73 86 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 73 86 133 74 87 134 73 86 133 72 85 132 73 86 133 -+72 85 132 73 86 133 66 80 128 31 47 105 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 23 40 100 -+38 54 109 72 85 132 71 84 131 71 85 132 71 85 132 70 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 69 83 131 68 82 130 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 68 82 130 69 83 131 -+67 81 129 68 82 130 68 82 130 68 82 130 68 82 130 67 81 129 -+69 83 130 51 66 119 23 39 99 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 53 67 120 67 81 129 65 79 128 66 80 128 -+66 80 128 66 80 127 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 65 79 128 65 79 128 64 78 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 64 78 127 63 77 126 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+63 77 126 62 76 125 64 78 127 29 46 103 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 23 40 99 -+49 64 117 59 74 124 61 75 125 61 75 125 61 75 125 61 75 125 -+60 75 125 59 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 59 74 124 58 73 123 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 57 72 122 -+58 73 123 57 72 122 58 73 123 44 61 114 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 42 57 112 57 72 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 55 70 121 -+54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+54 69 120 55 70 121 53 68 119 54 69 120 54 69 120 54 69 120 -+53 67 120 55 70 121 37 53 109 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+27 44 102 45 60 114 51 66 119 49 64 117 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 48 65 116 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+48 64 117 47 63 116 28 45 103 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 39 55 111 -+46 61 115 45 60 114 44 59 113 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 44 60 114 44 60 114 43 60 114 44 60 114 -+44 60 114 40 57 112 26 43 102 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 26 43 101 40 57 112 39 55 110 40 56 111 39 55 111 -+38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+34 50 107 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+71 85 132 71 85 132 71 85 132 70 85 132 72 85 132 72 85 132 -+71 84 131 31 47 105 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 29 46 104 70 84 131 -+73 86 133 72 85 132 73 86 133 72 85 132 73 86 133 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 73 86 134 74 87 134 75 88 134 74 87 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 74 87 133 -+75 88 134 76 89 135 76 89 135 75 88 134 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 88 135 -+76 88 135 76 89 135 76 90 135 76 90 135 76 89 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 88 135 76 88 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 75 88 134 -+76 89 135 75 88 134 74 87 133 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+74 87 134 73 86 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 73 86 133 74 87 134 72 85 132 73 86 133 -+73 86 133 72 85 132 73 86 133 55 69 121 25 42 101 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+23 40 99 55 70 121 73 85 132 72 84 131 71 85 132 70 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 70 84 131 -+71 85 132 69 83 130 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 69 83 131 70 84 131 68 82 130 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+68 82 130 67 81 129 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 67 81 129 27 44 102 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 36 52 108 68 81 130 66 80 129 66 80 129 -+66 80 128 66 80 127 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 65 79 128 64 78 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 64 78 127 -+63 77 126 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 63 77 126 64 78 127 42 58 112 23 40 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 23 40 100 -+38 54 110 59 74 124 61 75 125 61 75 125 61 75 125 61 75 125 -+60 75 125 59 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 59 74 124 58 73 123 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 57 72 122 -+58 73 123 58 73 123 58 73 123 51 66 119 27 44 103 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 34 50 107 57 72 122 -+55 69 121 56 70 122 56 70 122 56 70 122 56 70 122 55 70 121 -+54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 54 69 120 53 68 119 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 44 60 113 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+25 42 101 42 57 112 51 66 119 49 64 117 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 49 65 117 50 65 118 48 65 116 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+48 64 117 47 63 116 32 50 106 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 35 51 108 -+46 61 115 45 60 114 44 59 113 45 60 114 45 60 114 45 60 114 -+45 60 114 44 60 114 45 60 114 44 60 114 43 60 114 44 60 114 -+44 60 114 43 60 114 27 44 102 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 39 55 110 40 56 111 40 56 111 39 55 111 -+38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+35 51 108 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+71 85 132 71 85 132 70 85 132 71 85 132 72 85 132 73 86 133 -+48 63 117 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 60 75 125 74 87 133 -+72 85 132 73 86 133 73 86 133 73 86 133 74 87 134 73 86 133 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 73 86 134 -+73 86 134 74 87 134 74 87 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 74 87 133 75 88 134 -+76 89 135 75 88 134 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 88 135 76 89 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+77 90 136 77 90 136 76 90 135 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 89 135 76 90 135 76 89 135 76 88 135 76 88 135 76 88 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 75 88 134 75 88 134 74 87 133 74 87 133 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 74 87 134 -+75 88 134 74 87 134 73 86 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 73 86 133 73 86 133 72 85 132 -+72 85 132 73 86 133 73 86 133 72 85 132 39 55 110 25 42 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 26 43 102 70 83 130 72 85 132 72 84 131 71 85 132 -+70 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+70 84 131 71 85 132 69 83 130 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 69 83 131 68 82 130 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+68 82 130 67 81 129 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 44 61 114 23 40 99 25 42 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 29 45 103 59 74 124 66 80 129 65 79 128 -+66 80 129 66 80 128 66 80 127 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 65 79 128 64 78 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 64 78 127 -+63 77 126 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 63 77 126 63 77 126 56 71 121 23 40 99 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+27 44 103 59 74 124 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 60 75 125 59 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 59 74 124 58 73 123 58 73 123 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 57 72 122 -+57 72 122 58 73 123 58 73 123 56 71 121 30 46 104 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 29 47 104 55 69 121 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 55 70 121 -+54 70 120 54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 54 69 120 53 68 119 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 50 65 118 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 39 55 111 51 66 119 49 64 117 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 48 65 116 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 -+49 65 117 47 63 116 36 52 108 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 32 48 107 -+47 63 116 45 60 114 44 59 113 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 44 60 114 43 60 114 44 60 114 -+43 59 113 44 61 114 28 45 103 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 37 53 109 40 56 111 40 56 111 39 55 111 -+38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+38 54 109 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+71 85 132 70 85 132 71 85 132 71 85 132 72 85 132 64 78 127 -+31 47 105 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 23 40 99 46 61 115 75 88 134 72 85 132 -+73 86 133 73 86 133 73 86 133 74 87 134 73 86 133 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 73 86 134 74 87 134 -+74 87 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 74 87 133 75 88 134 76 89 135 -+75 88 134 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 88 135 76 88 135 76 89 135 76 90 135 -+76 89 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 76 90 135 77 90 136 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 89 135 76 89 135 76 88 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 75 88 134 75 88 134 74 87 133 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+74 87 134 75 88 134 74 87 134 73 86 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 73 86 133 -+73 86 133 72 85 132 72 85 132 73 86 133 65 79 128 27 44 103 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 43 58 114 73 86 133 72 85 132 72 85 132 -+70 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 70 84 131 69 83 130 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 69 83 131 69 83 131 68 82 130 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+68 82 130 68 82 130 67 81 129 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 60 75 125 25 42 101 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 48 63 117 66 80 129 66 80 128 -+66 80 129 66 80 128 66 80 127 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 65 79 128 64 78 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 64 78 127 -+63 77 126 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 63 77 126 62 76 125 63 77 126 28 45 102 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+23 40 99 56 70 122 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 60 75 125 59 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 59 74 124 58 73 123 59 74 124 -+59 74 124 59 74 124 59 74 124 58 73 123 59 74 124 58 73 123 -+57 72 122 58 73 123 58 73 123 59 74 124 34 50 107 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 28 45 103 51 66 119 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+55 70 121 54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 54 69 120 54 69 120 53 68 119 54 69 120 54 69 120 -+54 69 120 54 69 120 55 70 121 25 42 101 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 36 52 108 50 65 118 50 65 118 49 64 117 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 48 65 116 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 47 63 116 39 55 111 23 40 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 27 44 103 -+47 63 116 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 44 60 114 43 60 114 44 60 114 -+44 60 114 45 60 114 31 47 105 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 36 52 108 40 56 111 40 56 111 39 55 111 -+38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 24 41 100 24 41 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+71 85 132 70 85 132 71 85 132 72 84 131 71 84 131 48 63 117 -+23 40 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 23 40 100 34 50 106 70 84 131 73 86 133 73 86 133 -+73 86 133 72 85 132 73 86 133 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 73 86 134 74 87 134 -+75 88 134 74 87 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 74 87 133 75 88 134 76 89 135 75 88 134 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 88 135 76 89 135 76 89 135 76 90 135 76 89 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 77 90 136 77 90 136 76 90 135 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 76 90 135 77 90 136 -+77 90 136 77 90 136 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 89 135 76 90 135 76 90 135 76 89 135 -+76 88 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 75 88 134 76 89 135 75 88 134 74 87 133 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 74 87 134 75 88 134 74 87 134 73 86 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 73 86 133 74 87 134 -+73 86 133 72 85 132 73 86 133 72 85 132 75 88 134 55 69 121 -+23 39 99 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 27 44 103 61 75 125 72 85 132 72 84 131 -+71 85 132 70 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 70 84 131 70 84 131 69 83 130 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 69 83 131 69 83 131 -+68 82 130 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 68 82 130 67 81 129 68 82 130 68 82 130 68 82 130 -+68 82 130 67 81 129 65 79 128 37 53 109 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 38 54 110 64 78 128 66 80 129 -+66 80 129 66 80 128 66 80 128 66 80 127 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 65 79 128 65 79 128 64 78 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 64 78 127 -+64 78 127 63 77 126 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 63 77 126 63 77 126 63 77 126 39 55 111 23 40 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+23 40 100 44 60 114 62 76 125 61 75 125 61 75 125 61 75 125 -+61 75 125 60 75 125 59 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 59 74 124 58 73 123 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 -+57 72 122 58 73 123 57 72 122 59 74 124 42 57 112 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 26 43 102 47 63 116 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+55 70 121 54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 54 69 120 53 68 119 54 69 120 54 69 120 -+54 69 120 53 68 119 55 70 121 31 47 105 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 32 48 105 49 64 117 51 66 119 49 64 117 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 48 65 116 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 48 63 117 42 58 112 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 -+46 61 115 46 61 115 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 44 60 114 43 60 114 44 60 114 -+44 60 114 44 60 114 34 50 107 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 34 50 106 40 56 111 40 56 111 39 55 111 -+39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 38 54 110 -+39 55 111 26 43 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+70 85 132 71 85 132 72 85 132 72 85 132 67 80 128 26 43 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 25 42 101 57 72 122 73 86 133 72 85 132 73 86 133 -+72 85 132 73 86 133 74 87 134 73 86 133 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 74 87 133 75 88 134 76 89 135 75 88 134 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 88 135 76 89 135 76 90 135 76 90 135 76 89 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 77 90 136 -+77 90 136 76 90 135 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 76 90 135 77 90 136 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 89 135 76 90 135 -+76 89 135 76 88 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 75 88 134 76 89 135 75 88 134 -+74 87 133 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 74 87 134 73 86 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 72 85 132 73 86 133 73 86 133 73 86 133 73 86 133 -+38 54 110 23 40 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 42 57 112 71 84 131 72 85 132 -+71 85 132 70 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 70 84 131 69 83 130 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 69 83 131 -+68 82 130 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 68 82 130 67 81 129 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 49 64 117 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 29 46 104 59 74 124 66 80 129 -+66 80 128 66 80 129 66 80 128 66 80 127 66 80 128 66 80 128 -+66 80 128 66 80 128 65 79 128 66 80 128 65 79 128 64 78 128 -+65 79 128 65 79 128 65 79 128 65 79 128 64 78 127 65 79 128 -+64 78 127 63 77 126 64 78 127 64 78 127 64 78 127 64 78 127 -+63 77 126 64 78 127 63 77 126 63 77 126 51 66 119 23 39 99 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 33 49 106 62 76 125 59 74 124 61 75 125 61 75 125 -+61 75 125 61 75 125 60 75 125 59 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 59 74 124 58 73 123 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 -+57 72 122 58 73 123 58 73 123 58 73 123 49 65 117 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 43 58 114 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+55 70 121 54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 54 69 120 53 68 119 54 69 120 54 69 120 -+54 69 120 54 69 120 55 69 121 37 53 109 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 29 46 103 48 63 117 50 65 118 49 64 117 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 -+48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 48 63 117 43 60 114 26 43 102 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+43 58 114 46 61 115 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 44 60 114 43 60 114 44 60 114 -+44 60 114 44 60 114 37 53 109 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 32 48 105 40 56 111 40 56 111 40 56 111 -+39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 28 45 103 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+71 85 132 71 85 132 72 85 132 73 86 133 43 58 114 23 40 99 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 39 55 110 71 84 131 73 86 133 73 86 133 72 85 132 -+72 85 132 73 86 133 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 73 86 134 74 87 134 75 88 134 74 87 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+74 87 133 75 88 134 76 89 135 75 88 134 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 88 135 -+76 89 135 76 90 135 76 89 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 76 90 135 77 90 136 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 89 135 76 88 135 76 88 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 75 88 134 -+75 88 134 74 87 133 74 87 133 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 74 87 134 75 88 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+73 86 133 74 87 134 72 85 132 73 86 133 73 86 133 73 86 133 -+64 78 127 25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 27 44 102 61 75 125 72 85 132 -+72 85 132 71 85 132 70 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 70 84 131 69 83 130 69 83 130 -+70 84 131 70 84 131 70 84 131 70 84 131 69 83 131 70 84 131 -+69 83 131 68 82 130 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 68 82 130 67 81 129 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 59 74 124 29 46 103 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 23 40 99 55 69 121 65 79 128 -+66 80 129 66 80 129 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 63 77 126 62 76 125 57 72 122 27 43 102 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 25 42 101 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 60 75 125 59 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 59 74 124 60 75 125 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 -+57 72 122 58 73 123 58 73 123 58 73 123 57 72 122 25 42 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 38 54 110 -+55 69 121 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+55 70 121 54 70 120 54 70 120 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 54 69 120 53 68 119 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 44 60 114 23 40 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 26 43 102 47 63 116 50 65 118 49 64 117 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 -+48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 48 63 117 46 61 115 28 45 103 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+40 56 111 46 61 115 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 44 60 114 45 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 39 55 111 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 29 47 104 40 56 111 39 55 110 40 56 111 -+39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 30 46 104 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+71 85 132 72 84 131 72 85 132 65 79 128 23 40 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+27 43 102 61 75 125 74 87 133 72 85 132 72 85 132 73 86 133 -+73 86 133 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 73 86 134 74 87 134 74 87 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+74 87 133 75 88 134 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 88 135 76 89 135 -+76 90 135 76 89 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 77 90 136 76 90 135 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 76 89 135 76 89 135 -+76 89 135 76 89 135 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 89 135 76 90 135 76 89 135 76 88 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 75 88 134 74 87 133 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 74 87 134 75 88 134 73 86 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 73 86 133 72 85 132 73 86 133 72 85 132 -+72 85 132 46 61 115 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 23 40 99 42 58 112 71 84 131 -+71 84 131 71 85 132 71 85 132 70 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 70 84 131 71 85 132 70 84 131 69 83 130 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+69 83 131 68 82 130 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 36 52 108 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 23 40 100 40 56 111 65 79 128 -+65 79 128 66 80 128 66 80 129 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 65 79 128 66 80 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 64 78 127 -+65 79 128 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 63 77 126 64 78 127 63 77 126 59 74 124 34 50 107 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 52 67 118 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 60 75 125 59 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 59 74 124 -+58 73 123 58 73 123 58 73 123 57 72 122 60 75 125 29 46 104 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 34 50 107 -+54 69 120 56 70 122 56 70 122 56 70 122 56 70 122 55 70 121 -+56 70 122 55 70 121 54 70 120 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 54 69 120 54 69 120 53 68 119 54 69 120 -+54 69 120 54 69 120 54 69 120 50 65 118 23 40 99 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 23 40 100 46 61 115 50 65 118 49 64 117 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 -+48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 48 64 117 46 61 115 31 47 105 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+37 53 109 46 61 115 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 43 59 113 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 29 45 103 40 56 111 40 56 111 40 56 111 -+39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 32 48 105 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+71 85 132 72 84 131 74 87 134 38 54 109 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+42 57 112 74 87 134 73 86 133 73 86 133 72 85 132 73 86 133 -+74 87 134 73 86 133 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 73 86 134 74 87 134 74 87 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 74 87 133 -+75 88 134 76 89 135 75 88 134 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 88 135 76 89 135 76 90 135 -+76 89 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 77 90 136 -+77 90 136 76 90 135 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 76 89 135 76 89 135 76 89 135 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 76 89 135 -+76 89 135 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 76 90 135 77 90 136 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 89 135 76 90 135 76 89 135 76 88 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 75 88 134 75 88 134 74 87 133 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 74 87 134 -+73 86 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 73 86 133 73 86 133 72 85 132 73 86 133 73 86 133 -+73 86 133 64 78 127 29 46 104 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 64 78 127 -+72 85 132 72 85 132 71 85 132 70 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 68 82 130 69 83 131 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 67 81 129 69 83 131 48 63 117 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 26 43 102 65 79 128 -+65 79 128 66 80 129 66 80 129 66 80 127 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 64 78 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 63 77 126 62 76 125 40 56 111 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 43 58 114 62 76 125 61 75 125 61 75 125 -+61 75 125 61 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+58 73 123 58 73 123 58 73 123 58 73 123 59 74 124 38 54 110 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 29 47 104 -+52 67 118 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 55 70 121 54 70 120 55 70 121 55 70 121 55 70 121 -+55 70 121 54 69 120 55 70 121 54 69 120 53 68 119 54 69 120 -+54 69 120 54 69 120 53 68 119 53 68 119 25 42 101 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 23 40 100 40 57 112 51 66 119 49 64 117 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 -+48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+48 64 117 49 65 117 47 63 116 32 50 106 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+35 52 107 46 61 115 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 24 41 101 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 28 45 103 39 55 110 40 56 111 40 56 111 -+39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 34 50 107 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+72 84 131 72 85 132 61 75 125 27 44 102 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+70 84 131 73 86 133 72 85 132 73 86 133 73 86 133 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+73 86 134 74 87 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 74 87 133 75 88 134 -+76 89 135 75 88 134 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 88 135 76 89 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 76 89 135 -+76 89 135 77 90 136 77 90 136 77 90 136 77 90 136 78 91 137 -+78 91 137 78 91 137 78 91 137 77 90 136 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 77 90 136 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 77 90 136 77 90 136 -+77 90 136 76 89 135 76 89 135 76 89 135 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 76 90 135 77 90 136 77 90 136 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 89 135 76 90 135 76 89 135 76 88 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+75 88 134 76 89 135 76 89 135 74 87 133 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 74 87 134 75 88 134 -+74 87 134 73 86 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 73 86 133 72 85 132 73 86 133 -+73 86 133 74 87 134 45 60 114 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 23 40 100 40 56 111 -+74 87 133 71 84 131 72 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 70 84 131 71 85 132 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 69 83 131 -+70 84 131 68 82 130 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 67 81 129 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 64 78 127 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 23 39 99 56 70 122 -+66 80 129 66 80 129 66 80 129 66 80 128 66 80 127 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 65 79 128 -+64 78 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 63 77 126 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 62 76 125 63 77 126 47 63 116 -+25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 34 50 107 63 77 126 59 74 124 61 75 125 -+61 75 125 60 75 125 61 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 58 73 123 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 46 61 115 -+23 40 99 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 26 43 102 -+50 65 118 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 55 70 121 54 70 120 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 54 69 120 53 68 119 54 69 120 -+54 69 120 54 69 120 54 69 120 53 68 119 29 47 104 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 23 40 100 37 53 109 51 66 119 50 65 118 49 64 117 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 -+48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 48 64 117 48 64 117 35 52 107 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+32 48 107 46 61 115 45 60 114 44 59 113 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 44 60 114 -+44 60 114 43 59 113 44 60 114 27 44 102 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 27 44 102 38 54 109 40 56 111 40 56 111 -+39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 36 52 108 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+72 85 132 72 85 132 42 58 112 25 42 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 23 40 99 49 64 117 -+74 87 133 72 85 132 73 86 133 72 85 132 73 86 133 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+73 86 134 74 87 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 74 87 133 75 88 134 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 88 135 76 89 135 76 90 135 76 89 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 77 90 136 76 90 135 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 76 89 135 76 89 135 77 90 136 77 90 136 77 90 136 -+78 91 137 78 91 137 77 90 136 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 77 90 136 77 90 136 77 90 136 -+76 89 135 76 89 135 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 76 90 135 77 90 136 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 89 135 -+76 88 135 76 88 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 75 88 134 76 89 135 75 88 134 74 87 133 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+74 87 134 73 86 134 73 86 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 73 86 133 74 87 134 73 86 133 72 85 132 -+73 86 133 73 86 133 68 82 130 27 43 102 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 23 40 100 -+65 79 128 72 85 132 72 84 131 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 70 84 131 -+69 83 130 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+69 83 131 70 84 131 68 82 130 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 68 82 130 69 83 131 67 81 129 68 82 130 -+68 82 130 68 82 130 68 82 130 67 81 129 70 84 131 34 50 107 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 23 40 100 40 57 112 -+68 81 130 65 79 128 66 80 129 66 80 129 66 80 127 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+64 78 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+64 78 127 65 79 128 63 77 126 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 63 77 126 64 78 127 63 77 126 53 68 119 -+27 44 102 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 30 46 104 58 73 123 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 58 73 123 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+58 73 123 57 72 122 58 73 123 58 73 123 58 73 123 54 69 120 -+23 40 99 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 23 40 100 -+49 64 117 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 55 70 121 54 70 120 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 54 69 120 53 68 119 54 69 120 -+54 69 120 54 69 120 54 69 120 53 68 119 35 52 107 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 33 49 106 51 66 119 50 65 118 49 64 117 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 -+48 65 116 48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 48 64 117 48 64 117 37 53 109 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+30 46 104 46 61 115 46 61 115 44 59 113 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 29 47 104 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 27 44 102 37 53 109 40 56 111 40 56 111 -+39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 37 53 109 24 41 100 24 41 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+72 85 132 64 78 127 31 47 105 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 29 45 103 70 83 130 -+72 85 132 73 86 133 72 85 132 73 86 133 74 87 134 73 86 133 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 73 86 134 -+74 87 134 75 88 134 74 87 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 74 87 133 75 88 134 75 88 134 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 88 135 76 89 135 76 90 135 76 89 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 77 90 136 76 90 135 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+76 89 135 77 90 136 77 90 136 77 90 136 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 77 90 136 78 91 137 78 91 137 77 90 136 -+77 90 136 76 89 135 76 89 135 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 76 90 135 -+77 90 136 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 89 135 76 90 135 -+76 89 135 76 88 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 75 88 134 75 88 134 74 87 133 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 74 87 134 74 87 134 73 86 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 73 86 133 73 86 133 -+73 86 133 72 85 132 75 88 134 48 63 117 23 40 99 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+40 57 112 73 86 133 72 85 132 71 85 132 70 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 70 84 131 71 85 132 -+69 83 130 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 68 82 130 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 68 82 130 67 81 129 -+68 82 130 68 82 130 68 82 130 68 82 130 69 83 130 51 66 119 -+23 40 99 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 27 44 102 -+68 81 130 66 80 129 66 80 129 66 80 129 66 80 127 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+64 78 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 63 77 126 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 63 77 126 59 74 124 -+29 47 104 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 28 45 103 54 69 120 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 59 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 58 73 123 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 -+59 74 124 57 72 122 58 73 123 58 73 123 57 72 122 58 73 123 -+25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 23 40 99 -+44 60 114 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+55 70 121 56 70 122 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 54 69 120 53 68 119 54 69 120 -+54 69 120 54 69 120 54 69 120 53 68 119 39 55 110 23 40 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 29 46 104 51 66 119 50 65 118 49 64 117 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+49 65 117 48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 48 64 117 48 64 117 39 55 111 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+29 46 104 45 60 114 46 61 115 44 59 113 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 34 50 106 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 26 43 101 36 52 108 40 56 111 40 56 111 -+39 55 111 39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 -+38 54 110 38 54 110 25 42 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+71 84 131 52 67 118 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 23 40 99 50 65 118 72 85 132 -+72 85 132 73 86 133 72 85 132 73 86 133 73 86 133 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 73 86 134 -+75 88 134 74 87 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 74 87 133 75 88 134 76 89 135 75 88 134 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 88 135 -+76 89 135 76 90 135 76 89 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 76 89 135 76 89 135 -+77 90 136 78 91 137 78 91 137 78 91 137 77 90 136 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 77 90 136 78 91 137 -+78 91 137 77 90 136 77 90 136 76 89 135 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+76 90 135 77 90 136 77 90 136 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 89 135 -+76 90 135 76 89 135 76 88 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 75 88 134 75 88 134 -+74 87 133 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+74 87 134 75 88 134 74 87 134 73 86 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 73 86 133 74 87 134 72 85 132 -+73 86 133 73 86 133 73 86 133 71 84 131 27 44 102 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+29 45 103 65 79 128 72 85 132 72 85 132 70 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+70 84 131 69 83 130 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 69 83 131 68 82 130 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 68 82 130 68 82 130 67 81 129 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 66 80 128 -+23 40 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+58 73 123 66 80 129 66 80 129 66 80 129 66 80 128 66 80 127 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+65 79 128 64 78 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 63 77 126 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 62 76 125 64 78 127 -+34 50 106 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 26 43 101 48 63 117 61 75 125 60 75 125 -+61 75 125 61 75 125 61 75 125 60 75 125 59 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 58 73 123 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 57 72 122 58 73 123 58 73 123 58 73 123 57 72 122 -+32 48 105 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 23 40 100 -+38 54 110 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 53 68 119 44 59 113 23 40 99 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 25 42 101 51 66 119 50 65 118 49 64 117 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+49 65 117 48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 48 64 117 48 64 117 42 57 112 26 43 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+28 45 103 43 59 113 46 61 115 44 59 113 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 43 60 114 -+44 60 114 44 60 114 44 60 114 35 51 108 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 25 42 101 36 52 108 40 56 111 39 55 111 -+40 56 111 39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 -+39 55 111 38 54 110 25 43 102 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+69 83 130 34 50 107 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 29 47 104 64 78 127 73 86 133 -+73 86 133 72 85 132 73 86 133 73 86 133 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 73 86 134 74 87 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 74 87 133 75 88 134 76 89 135 75 88 134 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 88 135 76 89 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 77 90 136 -+77 90 136 76 90 135 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 76 89 135 77 90 136 77 90 136 -+77 90 136 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+77 90 136 78 91 137 78 91 137 77 90 136 76 89 135 76 89 135 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 89 135 76 90 135 76 89 135 76 88 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+75 88 134 74 87 133 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 73 86 133 -+72 85 132 73 86 133 72 85 132 73 86 133 51 66 119 23 39 99 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 49 64 117 73 86 133 72 85 132 71 85 132 70 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 70 84 131 -+70 84 131 69 83 130 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 69 83 131 69 83 131 68 82 130 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 68 82 130 67 81 129 -+68 82 130 68 82 130 68 82 130 68 82 130 67 81 129 68 82 130 -+35 52 107 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+44 61 114 68 81 130 66 80 129 66 80 128 66 80 128 66 80 127 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 65 79 128 -+65 79 128 64 78 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 64 78 127 63 77 126 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 62 76 125 64 78 127 -+42 58 112 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 43 59 113 61 75 125 61 75 125 -+61 75 125 61 75 125 60 75 125 61 75 125 59 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 -+58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 57 72 122 58 73 123 58 73 123 58 73 123 57 72 122 -+38 54 110 23 40 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+33 49 106 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 54 69 120 55 70 121 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 47 63 116 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 23 40 99 49 64 117 50 65 118 49 64 117 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+49 65 117 48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 48 64 117 48 64 117 43 60 114 26 43 102 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+27 44 102 42 57 112 46 61 115 44 59 113 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 44 60 114 45 60 114 43 60 114 -+44 60 114 44 60 114 44 60 114 38 54 110 23 40 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 25 42 101 34 50 107 40 56 111 40 56 111 -+40 56 111 39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 -+39 55 111 38 54 110 27 44 102 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+62 76 125 23 39 99 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 42 57 112 73 86 133 73 86 133 -+72 85 132 72 85 132 73 86 133 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 73 86 134 73 86 134 74 87 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+74 87 133 75 88 134 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 88 135 76 89 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+76 89 135 76 89 135 76 89 135 77 90 136 78 91 137 77 90 136 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 77 90 136 78 91 137 78 91 137 77 90 136 -+76 89 135 76 89 135 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 76 90 135 77 90 136 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 89 135 76 88 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+75 88 134 74 87 133 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 74 87 134 73 86 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+73 86 133 72 85 132 73 86 133 72 85 132 68 81 130 28 45 103 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 36 52 108 68 81 130 72 85 132 71 85 132 70 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+70 84 131 69 83 130 69 83 130 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 69 83 131 68 82 130 68 82 130 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 68 82 130 67 81 129 -+67 81 129 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+49 64 117 23 40 99 24 41 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+34 50 107 68 82 130 66 80 129 66 80 129 66 80 128 66 80 127 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+65 79 128 64 78 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 64 78 127 63 77 126 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 63 77 126 63 77 126 63 77 126 -+50 65 118 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 38 54 110 59 74 124 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 59 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 -+58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 58 73 123 57 72 122 58 73 123 58 73 123 57 72 122 -+43 60 114 23 40 99 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+27 44 102 56 70 122 55 69 121 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 48 64 116 26 43 102 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 23 40 100 46 61 115 51 66 119 49 64 117 -+49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+49 65 117 48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 48 64 117 46 61 115 27 44 102 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+26 43 102 40 56 111 46 61 115 44 59 113 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 43 60 114 -+44 60 114 44 60 114 44 60 114 40 56 111 23 40 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 101 24 41 100 34 50 106 40 56 111 40 56 111 -+40 56 111 39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 -+39 55 111 38 54 110 28 45 103 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+40 57 112 23 40 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 26 43 102 59 74 124 74 87 133 72 85 132 -+72 85 132 73 86 133 74 87 134 73 86 133 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 73 86 134 74 87 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+74 87 133 75 88 134 75 88 134 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 88 135 76 89 135 76 90 135 -+76 89 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+76 89 135 77 90 136 77 90 136 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 77 90 136 77 90 136 -+77 90 136 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 77 90 136 77 90 136 77 90 136 77 90 136 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 77 90 136 78 91 137 -+77 90 136 77 90 136 76 89 135 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 76 90 135 77 90 136 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 89 135 76 89 135 76 88 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 75 88 134 -+76 89 135 75 88 134 74 87 133 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 74 87 134 75 88 134 74 87 134 73 86 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 73 86 133 -+73 86 133 72 85 132 73 86 133 73 86 133 71 85 132 45 60 114 -+23 40 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 26 43 101 61 75 125 72 85 132 71 85 132 71 85 132 -+70 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 70 84 131 69 83 130 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 69 83 131 68 82 130 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 68 82 130 -+67 81 129 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+59 74 124 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+29 46 104 62 76 125 66 80 129 66 80 129 66 80 128 66 80 128 -+66 80 127 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+65 79 128 65 79 128 64 78 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 64 78 127 63 77 126 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 63 77 126 63 77 126 -+58 73 123 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 34 50 106 58 73 123 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 59 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 -+58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+58 73 123 59 74 124 57 72 122 58 73 123 58 73 123 57 72 122 -+49 65 117 23 40 99 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+23 40 99 55 69 121 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 50 65 118 29 45 103 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 23 40 100 40 57 112 51 66 119 50 65 118 -+49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+49 65 117 48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 48 64 117 48 64 117 28 45 103 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+25 42 101 39 55 110 46 61 115 44 59 113 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 43 60 114 -+44 60 114 44 60 114 44 60 114 42 58 112 23 40 100 24 41 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 33 49 106 39 55 110 40 56 111 -+40 56 111 39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 -+39 55 111 38 54 110 29 46 104 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+26 43 102 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 34 50 107 74 87 134 73 86 133 73 86 133 -+72 85 132 73 86 133 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 73 86 134 74 87 134 74 87 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 74 87 133 -+75 88 134 75 88 134 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 88 135 76 89 135 76 90 135 76 89 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 77 90 136 76 90 135 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 76 89 135 -+77 90 136 78 91 137 78 91 137 77 90 136 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 77 90 136 77 90 136 77 90 136 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 77 90 136 -+77 90 136 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 77 90 136 -+78 91 137 77 90 136 77 90 136 76 89 135 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 76 90 135 -+77 90 136 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 89 135 76 90 135 76 89 135 76 88 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+75 88 134 76 89 135 74 87 133 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 74 87 134 74 87 134 73 86 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+73 86 133 73 86 133 72 85 132 73 86 133 73 86 133 59 74 124 -+27 44 102 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 23 40 99 47 63 116 71 84 131 72 85 132 71 85 132 -+70 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 70 84 131 69 83 130 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 69 83 131 68 82 130 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 68 82 130 -+67 81 129 68 82 130 68 82 130 68 82 130 68 82 130 67 81 129 -+64 78 127 32 48 105 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+27 44 102 55 69 121 66 80 129 66 80 129 66 80 129 66 80 128 -+66 80 127 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 65 79 128 64 78 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 64 78 127 64 78 127 63 77 126 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 63 77 126 62 76 125 -+64 78 127 27 44 102 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 29 46 104 56 71 121 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 60 75 125 59 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 -+58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 58 73 123 57 72 122 58 73 123 58 73 123 58 73 123 -+52 67 118 25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+23 40 99 50 65 118 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 55 70 121 54 70 120 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 51 66 119 32 48 105 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 37 53 109 51 66 119 50 65 118 -+49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+49 65 117 48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 48 64 116 50 65 118 29 46 103 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+25 42 101 38 54 109 46 61 115 45 60 114 44 59 113 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 43 60 114 -+44 60 114 44 60 114 43 59 113 43 59 113 25 42 101 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 32 48 105 39 55 110 40 56 111 -+40 56 111 39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 -+39 55 111 38 54 110 31 47 105 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 23 40 100 55 70 121 74 87 134 72 85 132 73 86 133 -+73 86 133 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 73 86 134 74 87 134 75 88 134 74 87 134 -+75 88 134 75 88 134 75 88 134 75 88 134 74 87 133 75 88 134 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 88 135 76 89 135 76 89 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 77 90 136 76 90 135 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 76 89 135 77 90 136 -+78 91 137 77 90 136 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+77 90 136 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 77 90 136 77 90 136 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+77 90 136 78 91 137 78 91 137 76 89 135 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 89 135 76 90 135 76 89 135 -+76 88 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 75 88 134 74 87 133 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 74 87 134 -+73 86 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 73 86 133 72 85 132 73 86 133 73 86 133 71 85 132 -+34 50 107 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 29 45 103 71 84 131 71 84 131 72 85 132 -+71 85 132 70 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 70 84 131 69 83 130 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 69 83 131 68 82 130 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+68 82 130 67 81 129 68 82 130 68 82 130 68 82 130 68 82 130 -+66 80 129 40 56 111 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 47 63 116 67 80 128 65 79 128 66 80 129 66 80 128 -+66 80 127 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 65 79 128 64 78 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 64 78 127 63 77 126 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 63 77 126 -+64 78 127 36 52 108 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 101 54 69 120 61 75 125 -+61 75 125 61 75 125 61 75 125 60 75 125 60 75 125 59 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 -+58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 58 73 123 57 72 122 58 73 123 58 73 123 58 73 123 -+53 67 120 29 45 103 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+23 40 100 44 60 114 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 55 70 121 56 70 122 54 70 120 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 52 67 118 34 50 107 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 33 49 106 52 67 118 50 65 118 -+49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 49 65 117 48 65 116 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 48 64 117 49 65 117 32 48 105 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 37 53 109 46 61 115 45 60 114 44 59 113 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 43 60 114 -+44 60 114 44 60 114 44 60 114 43 59 113 27 43 102 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 31 47 105 39 55 110 40 56 111 -+40 56 111 39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 -+39 55 111 38 54 110 32 48 107 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 27 43 102 73 86 134 73 86 133 73 86 133 72 85 132 -+73 86 133 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 75 88 134 74 87 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 88 135 76 88 135 76 89 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+77 90 136 76 90 135 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 76 89 135 76 89 135 77 90 136 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 77 90 136 77 90 136 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 77 90 136 76 89 135 74 87 130 74 87 130 -+74 87 130 73 86 130 73 86 130 73 86 130 74 87 130 74 87 130 -+74 87 130 75 88 134 76 89 135 77 90 136 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 77 90 136 77 90 136 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 77 90 136 78 91 137 77 90 136 76 89 135 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 89 135 76 88 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 75 88 134 74 87 133 74 87 133 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 74 87 134 -+73 86 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 73 86 133 72 85 132 72 85 132 72 85 132 74 87 134 -+49 64 117 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 23 39 99 59 74 124 72 85 132 72 85 132 -+71 85 132 70 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 70 84 131 69 83 130 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 69 83 131 68 82 130 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+68 82 130 67 81 129 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 48 64 117 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 40 56 111 65 79 128 66 80 129 66 80 129 66 80 128 -+66 80 127 66 80 127 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 65 79 128 64 78 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 64 78 127 63 77 126 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 63 77 126 -+64 78 127 45 60 114 23 40 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 23 40 99 50 65 118 59 74 124 -+61 75 125 61 75 125 61 75 125 61 75 125 60 75 125 59 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+59 74 124 58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 58 73 123 57 72 122 58 73 123 58 73 123 58 73 123 -+55 70 121 32 48 105 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 39 55 110 57 72 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 54 70 120 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 53 68 119 -+54 69 120 54 69 120 54 69 120 54 69 120 53 67 120 36 52 108 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 31 47 105 53 67 120 50 65 118 -+49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 49 65 117 48 65 116 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 48 64 117 49 64 117 36 52 108 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 35 51 108 44 60 115 45 60 114 44 59 113 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 43 60 114 -+44 60 114 44 60 114 44 60 114 43 59 113 28 45 103 24 41 100 -+25 42 101 25 42 101 24 41 99 18 31 73 15 19 34 24 40 99 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 29 46 104 39 55 110 40 56 111 -+40 56 111 39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 -+39 55 111 38 54 110 33 49 106 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+23 40 99 47 63 116 74 87 133 72 85 132 73 86 133 72 85 132 -+74 87 134 73 86 133 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 73 86 134 74 87 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 76 89 135 -+75 88 134 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 88 135 76 89 135 76 90 135 76 89 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 77 90 136 -+76 90 135 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 76 89 135 77 90 136 78 91 137 77 90 136 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 77 90 136 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 74 87 130 59 73 120 -+49 61 101 39 49 83 33 41 67 31 35 49 15 19 34 12 14 18 -+6 8 19 6 7 9 6 7 9 6 7 9 6 7 9 12 14 18 -+20 20 21 15 19 34 31 35 49 33 41 67 42 55 96 49 61 101 -+59 73 120 73 86 130 78 91 137 78 91 137 78 91 137 78 91 137 -+77 90 136 77 90 136 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 77 90 136 77 90 136 77 90 136 -+76 89 135 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 76 90 135 77 90 136 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 89 135 -+76 89 135 76 88 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 75 88 134 74 87 133 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 74 87 134 -+74 87 134 73 86 134 74 87 134 74 87 134 74 87 134 74 87 134 -+73 86 133 74 87 134 73 86 133 72 85 132 73 86 133 73 86 133 -+67 81 129 26 43 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 23 40 100 39 55 111 74 87 133 72 84 131 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+68 82 130 67 81 129 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 55 70 121 27 44 102 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 34 50 107 62 76 125 66 80 129 66 80 128 66 80 129 -+66 80 128 66 80 127 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 65 79 128 65 79 128 64 78 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 64 78 127 63 77 126 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 63 77 126 -+63 77 126 53 67 120 23 40 99 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 23 40 99 44 59 113 59 74 124 -+61 75 125 61 75 125 61 75 125 61 75 125 60 75 125 59 75 125 -+60 75 125 60 75 125 49 62 109 49 61 101 49 61 101 49 61 101 -+49 61 101 49 61 101 49 61 101 49 61 101 49 61 101 49 61 101 -+49 61 101 49 61 101 49 61 101 44 57 102 49 61 101 49 61 101 -+44 57 102 22 36 89 22 36 89 22 36 89 22 36 89 22 36 89 -+22 36 89 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 22 36 89 22 36 89 -+22 36 89 22 36 89 44 57 102 44 57 102 44 57 102 44 57 102 -+44 57 102 44 57 102 44 57 102 42 55 96 44 57 102 44 57 102 -+44 57 102 44 57 102 44 57 102 42 55 96 44 57 102 42 55 96 -+42 55 96 49 62 109 54 69 120 54 69 120 54 69 120 38 54 110 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 22 36 89 -+22 36 89 22 36 89 22 36 89 22 36 89 22 36 89 22 36 89 -+22 36 89 22 36 89 22 36 89 22 36 89 22 36 89 22 36 89 -+22 36 89 22 36 89 22 36 89 22 36 89 42 55 96 42 55 96 -+42 55 96 42 55 96 42 55 96 44 57 102 50 65 118 50 65 118 -+50 65 118 49 65 117 48 65 116 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 48 64 117 48 64 117 38 54 110 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 34 50 106 45 60 114 45 60 114 44 59 113 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 -+43 60 114 44 60 114 44 60 114 43 59 113 30 46 104 24 41 100 -+24 41 99 18 31 73 15 19 34 0 0 0 6 7 9 24 40 99 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 29 45 103 39 55 110 40 56 111 -+40 56 111 39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 34 50 107 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+23 40 100 66 80 128 73 86 133 73 86 133 72 85 132 73 86 133 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 73 86 134 75 88 134 74 87 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 74 87 133 75 88 134 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 76 89 135 77 90 136 78 91 137 77 90 136 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+77 90 136 77 90 136 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 76 90 135 49 61 101 33 41 67 15 19 34 12 14 18 -+0 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 2 3 5 -+12 14 18 15 19 34 33 41 67 49 61 101 76 90 135 78 91 137 -+78 91 137 77 90 136 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 77 90 136 -+77 90 136 76 89 135 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 76 90 135 77 90 136 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 89 135 76 89 135 76 88 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 75 88 134 75 88 134 74 87 133 -+75 88 134 75 88 134 75 88 134 75 88 134 74 87 134 75 88 134 -+74 87 134 73 86 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 73 86 133 73 86 133 73 86 133 73 86 133 -+75 88 134 37 53 109 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 25 42 101 70 83 130 72 85 132 -+72 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 70 84 131 71 85 132 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 69 83 131 70 84 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 61 75 125 31 47 105 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 28 45 103 59 74 124 66 80 129 66 80 129 66 80 129 -+66 80 128 66 80 127 66 80 128 66 80 128 66 80 128 66 80 128 -+65 79 128 66 80 128 65 79 128 64 78 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 64 78 127 64 78 127 63 77 126 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 63 77 126 -+63 77 126 61 75 125 23 39 99 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 23 40 100 38 54 110 59 74 124 -+61 75 125 61 75 125 61 75 125 61 75 125 60 75 125 59 75 125 -+60 75 125 60 75 125 31 35 49 6 7 9 6 8 19 6 8 19 -+6 8 19 6 8 19 6 8 19 6 8 19 6 8 19 6 8 19 -+6 8 19 6 8 19 6 8 19 6 8 19 6 8 19 6 8 19 -+6 8 19 6 7 9 6 7 9 6 7 9 6 7 9 6 7 9 -+6 8 19 25 42 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 17 24 45 2 3 5 -+6 7 9 6 7 9 6 8 19 6 8 19 6 8 19 6 8 19 -+6 8 19 6 8 19 6 8 19 6 8 19 6 8 19 6 8 19 -+6 8 19 6 8 19 6 8 19 6 8 19 6 8 19 6 8 19 -+6 7 9 31 35 49 54 69 120 53 67 120 54 69 120 40 57 112 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 100 6 8 19 -+6 7 9 6 7 9 6 7 9 6 7 9 6 7 9 6 7 9 -+6 7 9 6 7 9 6 7 9 6 7 9 6 7 9 6 7 9 -+6 7 9 6 7 9 6 7 9 6 7 9 6 7 9 6 7 9 -+6 7 9 6 7 9 6 7 9 17 26 56 50 65 118 50 65 118 -+50 65 118 49 65 117 48 65 116 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 48 64 117 48 64 117 40 56 111 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 32 48 107 45 60 114 45 60 114 44 59 113 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 45 60 114 -+43 60 114 44 60 114 44 60 114 43 59 113 32 48 105 18 31 73 -+15 19 34 1 2 4 0 0 0 0 0 0 6 8 19 24 40 99 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 27 44 102 38 54 110 40 56 111 -+40 56 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 35 51 108 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+36 52 108 70 84 131 72 85 132 73 86 133 72 85 132 73 86 133 -+73 86 133 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+73 86 134 74 87 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 74 87 133 76 89 135 75 88 134 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 90 135 76 89 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+76 89 135 77 90 136 78 91 137 77 90 136 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 77 90 136 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 75 88 134 -+33 41 67 12 14 18 5 5 5 0 0 1 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 1 0 0 1 0 0 0 -+0 0 0 0 0 0 0 0 1 5 5 5 12 14 18 33 41 67 -+74 87 130 78 91 137 77 90 136 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 77 90 136 78 91 137 -+78 91 137 76 89 135 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 89 135 76 88 135 76 89 135 76 89 135 -+76 89 135 76 89 135 75 88 134 76 89 135 75 88 134 74 87 133 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 73 86 133 74 87 134 73 86 133 73 86 133 72 85 132 -+74 87 133 58 73 123 23 39 99 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 55 70 121 73 86 133 -+72 85 132 70 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 68 82 130 -+69 83 131 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 34 50 106 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 23 40 100 56 70 122 66 80 129 66 80 129 66 80 129 -+66 80 128 66 80 127 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 65 79 128 64 78 128 65 79 128 65 79 128 -+65 79 128 65 79 128 64 78 127 65 79 128 64 78 127 63 77 126 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 63 77 126 -+62 76 125 63 77 126 27 44 103 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 32 48 105 59 74 124 -+61 75 125 61 75 125 61 75 125 61 75 125 60 75 125 59 75 125 -+60 75 125 60 75 125 33 41 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 25 42 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 2 3 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 15 19 34 49 62 109 54 69 120 54 69 120 43 59 113 -+25 42 101 25 42 101 25 42 101 25 42 101 22 36 89 0 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 1 1 33 41 67 50 65 118 50 65 118 -+50 65 118 49 65 117 48 65 116 49 65 117 49 65 117 49 65 117 -+49 65 117 48 64 117 49 65 117 48 64 117 42 58 112 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 31 47 105 44 60 114 45 60 114 44 59 113 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 -+43 60 114 44 60 114 44 60 114 42 55 96 15 19 34 1 2 4 -+0 0 0 0 0 0 0 0 0 0 0 0 6 8 19 24 40 99 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 26 43 102 38 54 110 40 56 111 -+39 55 111 40 56 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 35 51 108 25 42 101 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 23 40 99 -+50 65 118 72 85 132 73 86 133 72 85 132 72 85 132 73 86 133 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+73 86 134 74 87 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 74 87 133 75 88 134 75 88 134 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 88 135 76 89 135 -+76 90 135 76 89 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 77 90 136 76 90 135 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 76 89 135 76 89 135 -+77 90 136 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 77 90 136 77 90 136 78 91 137 -+78 91 137 78 91 137 78 91 137 74 87 130 33 41 67 0 0 0 -+0 0 0 0 0 0 0 0 1 0 0 0 5 5 5 6 7 9 -+20 20 21 80 80 80 132 132 134 177 177 177 209 209 209 243 243 243 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+230 230 230 209 209 209 177 177 177 132 132 134 80 80 80 20 20 21 -+6 7 9 5 5 5 0 0 0 0 0 1 0 0 0 0 0 0 -+0 0 0 33 41 67 71 84 128 78 91 137 78 91 137 77 90 136 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+77 90 136 78 91 137 77 90 136 76 89 135 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 75 88 134 76 89 135 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 74 87 134 73 86 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 73 86 133 72 85 132 73 86 133 -+73 86 133 73 86 133 25 43 102 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 39 55 110 74 87 133 -+72 85 132 72 85 132 70 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 70 84 131 69 83 130 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 69 83 131 -+68 82 130 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+67 81 129 70 84 131 40 57 112 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 23 40 99 49 64 117 65 79 128 66 80 129 66 80 129 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 65 79 128 64 78 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 64 78 127 63 77 126 -+64 78 127 64 78 127 64 78 127 64 78 127 63 77 126 64 78 127 -+63 77 126 63 77 126 34 50 107 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 26 43 102 59 74 124 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 60 75 125 -+59 75 125 60 75 125 49 61 101 0 0 0 0 0 0 0 0 0 -+6 7 9 6 7 9 6 7 9 6 7 9 6 7 9 6 7 9 -+6 7 9 6 7 9 6 7 9 6 7 9 6 7 9 6 7 9 -+6 7 9 6 7 9 6 7 9 6 7 9 5 5 5 0 0 0 -+0 0 0 22 36 89 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 22 36 89 0 0 0 0 0 0 -+5 5 5 6 7 9 6 7 9 6 7 9 6 7 9 6 7 9 -+6 7 9 6 7 9 6 7 9 6 7 9 6 7 9 6 7 9 -+6 7 9 6 7 9 6 7 9 6 7 9 12 14 18 0 1 1 -+0 0 0 2 3 5 42 55 96 54 69 120 54 69 120 44 61 114 -+26 43 102 25 42 101 25 42 101 25 42 101 17 26 56 0 1 1 -+0 0 0 5 5 5 6 7 9 6 7 9 6 7 9 6 7 9 -+6 7 9 6 7 9 6 7 9 6 7 9 6 7 9 6 7 9 -+6 7 9 6 7 9 6 7 9 6 7 9 6 7 9 6 7 9 -+0 1 1 0 0 0 2 3 5 39 49 83 50 65 118 50 65 118 -+50 65 118 49 65 117 48 65 116 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 48 64 117 46 61 115 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 29 46 103 44 59 113 45 60 114 44 59 113 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 -+43 60 114 42 55 96 17 24 45 0 0 0 0 0 0 0 0 0 -+0 0 0 6 7 9 0 0 0 0 0 0 6 8 19 24 40 99 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 25 42 101 38 54 110 40 56 111 -+40 56 111 40 56 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 36 52 108 25 42 101 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 27 44 102 -+61 75 125 73 86 133 73 86 133 72 85 132 73 86 133 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 73 86 134 -+74 87 134 74 87 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 74 87 133 75 88 134 75 88 134 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 88 135 76 90 135 -+76 89 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 77 90 136 76 90 135 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+78 91 137 77 90 136 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 77 90 136 78 91 137 78 91 137 78 91 137 -+78 91 137 74 87 130 39 49 83 6 7 9 0 0 0 0 0 0 -+0 0 1 0 1 1 31 31 31 80 80 80 154 154 154 230 230 230 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 254 254 254 255 255 255 254 254 254 254 254 254 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+209 209 209 146 146 148 80 80 80 44 44 44 1 2 4 0 0 1 -+0 0 0 0 0 0 6 7 9 39 49 83 71 84 128 77 90 136 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 77 90 136 77 90 136 77 90 136 76 89 135 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 76 90 135 77 90 136 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 89 135 76 90 135 76 88 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 75 88 134 -+74 87 133 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+74 87 134 75 88 134 73 86 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 73 86 133 74 87 134 72 85 132 73 86 133 -+72 85 132 73 86 133 43 59 113 23 40 99 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 30 46 104 68 82 130 -+72 85 132 72 85 132 70 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 70 84 131 71 85 132 69 83 130 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 69 83 131 70 84 131 -+68 82 130 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 68 82 130 67 81 129 68 82 130 68 82 130 68 82 130 -+68 82 130 69 83 130 50 65 118 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 23 40 100 40 57 112 65 79 128 66 80 129 66 80 128 -+66 80 129 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 64 78 127 63 77 126 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+63 77 126 63 77 126 40 57 112 23 40 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 23 40 99 58 73 123 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 60 75 125 -+59 75 125 60 75 125 55 67 113 6 7 9 0 0 0 0 0 0 -+243 243 243 251 251 251 248 248 248 248 248 248 248 248 248 248 248 248 -+248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 -+248 248 248 248 248 248 248 248 248 251 251 251 118 119 119 0 0 0 -+0 0 0 17 26 56 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 17 24 45 0 0 0 0 0 0 -+118 119 119 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 -+248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 -+248 248 248 248 248 248 248 248 248 248 248 248 255 255 255 55 55 55 -+0 0 0 0 0 0 39 49 83 54 69 120 54 69 120 48 64 116 -+27 44 102 25 42 101 25 42 101 25 42 101 17 24 45 0 0 1 -+0 0 0 96 96 96 251 251 251 248 248 248 248 248 248 248 248 248 -+248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 -+248 248 248 248 248 248 248 248 248 248 248 248 251 251 251 209 209 209 -+20 20 21 0 0 0 6 7 9 48 60 105 50 65 118 50 65 118 -+50 65 118 49 65 117 48 65 116 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 48 64 117 47 63 116 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 27 44 103 44 59 113 45 60 114 44 59 113 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 42 55 96 -+17 26 56 1 2 4 0 0 0 0 0 0 0 0 0 12 14 18 -+80 80 80 177 177 177 0 0 0 0 0 0 6 8 19 24 40 99 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 25 42 101 38 54 109 40 56 111 -+40 56 111 40 56 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 36 52 108 26 43 102 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 34 50 107 -+68 81 130 73 86 133 73 86 133 72 85 132 73 86 133 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 73 86 134 -+74 87 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 74 87 133 75 88 134 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 88 135 76 89 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 78 91 137 -+77 90 136 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 77 90 136 78 91 137 78 91 137 78 91 137 78 91 137 -+55 67 113 17 24 45 0 0 0 0 0 0 0 0 0 0 0 0 -+66 66 66 154 154 154 209 209 209 255 255 255 255 255 255 255 255 255 -+255 255 255 254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 255 255 255 -+255 255 255 255 255 255 255 255 255 209 209 209 154 154 154 80 80 80 -+0 0 0 0 0 0 0 0 0 0 0 0 15 19 34 49 61 101 -+77 90 136 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 77 90 136 76 89 135 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 89 135 76 88 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 75 88 134 76 89 135 -+74 87 133 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 73 86 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 72 85 132 73 86 133 -+73 86 133 73 86 133 59 74 124 23 39 99 25 42 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 27 44 102 58 73 123 -+72 85 132 72 85 132 70 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 69 83 130 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+68 82 130 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+68 82 130 69 83 131 67 81 129 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 59 74 124 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 33 49 106 65 79 128 66 80 129 66 80 129 -+66 80 129 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 65 79 128 66 80 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 64 78 127 63 77 126 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+63 77 126 63 77 126 47 63 116 23 40 99 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 23 40 99 53 67 120 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 60 75 125 -+59 75 125 60 75 125 56 69 119 15 19 34 0 0 0 0 0 0 -+177 177 177 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 177 177 177 0 0 0 -+0 0 0 15 19 34 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 6 8 19 0 0 0 0 0 0 -+177 177 177 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 141 141 145 -+0 0 0 0 0 0 17 24 45 53 68 119 54 69 120 50 65 118 -+28 45 103 25 42 101 25 42 101 25 42 101 6 8 19 0 0 0 -+2 3 5 137 138 138 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 177 177 177 -+0 1 1 0 0 0 6 8 19 50 65 118 50 65 118 50 65 118 -+50 65 118 49 65 117 48 65 116 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 48 64 117 49 65 117 25 42 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 27 43 102 43 59 113 45 60 114 44 59 113 45 60 114 -+45 60 114 45 60 114 45 60 114 42 55 96 17 24 45 6 7 9 -+0 0 0 0 0 0 0 0 0 0 0 0 96 96 96 177 177 177 -+255 255 255 251 251 251 0 0 0 0 0 0 6 8 19 24 40 99 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 38 54 109 39 55 111 -+40 56 111 40 56 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 37 53 109 26 43 102 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 40 57 112 -+74 87 133 73 86 133 72 85 132 73 86 133 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 73 86 134 74 87 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 74 87 133 75 88 134 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 88 135 76 89 135 76 89 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 76 89 135 77 90 136 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+77 90 136 78 91 137 78 91 137 78 91 137 78 91 137 39 49 83 -+6 7 9 0 0 0 0 0 0 0 0 1 44 44 44 177 177 177 -+243 243 243 255 255 255 255 255 255 255 255 255 254 254 254 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 254 254 254 255 255 255 255 255 255 255 255 255 243 243 243 -+209 209 209 55 55 55 0 0 1 0 0 0 0 0 0 6 7 9 -+39 49 83 77 90 136 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 77 90 136 76 89 135 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 76 90 135 -+77 90 136 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 89 135 76 90 135 76 88 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+74 87 133 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 74 87 134 73 86 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 73 86 133 72 85 132 -+73 86 133 73 86 133 67 80 128 28 45 103 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 49 64 117 -+73 86 133 72 84 131 71 85 132 70 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 69 83 130 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+68 82 130 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 67 81 129 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 81 130 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 26 43 101 65 79 128 65 79 128 66 80 129 -+66 80 129 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+63 77 126 63 77 126 53 68 119 23 39 99 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 23 40 99 47 63 116 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 60 75 125 -+59 75 125 60 75 125 59 74 124 31 35 49 0 0 0 0 0 0 -+118 119 119 255 255 255 254 254 254 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 209 209 209 0 0 0 -+0 0 0 6 7 9 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 22 36 89 0 1 1 0 0 0 20 20 21 -+209 209 209 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 230 230 230 -+0 0 0 0 0 0 6 7 9 53 68 119 54 69 120 52 67 118 -+29 45 103 25 42 101 25 42 101 22 39 98 6 8 19 0 0 0 -+12 14 18 177 177 177 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 132 132 134 -+0 0 0 0 0 0 17 24 45 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 48 64 116 49 65 117 27 44 102 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 25 42 101 43 58 114 45 60 114 44 59 113 45 60 114 -+45 60 114 39 56 109 17 24 45 2 3 5 0 0 0 0 0 0 -+0 0 0 0 0 0 80 80 80 209 209 209 243 243 243 255 255 255 -+255 255 255 248 248 248 0 0 0 0 0 0 6 8 19 24 40 99 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 23 40 100 37 53 109 40 56 111 -+40 56 111 40 56 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 37 53 109 27 44 102 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 26 43 101 53 67 120 -+74 87 133 72 85 132 72 85 132 73 86 133 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 73 86 134 74 87 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+74 87 133 75 88 134 76 89 135 75 88 134 76 89 135 76 89 135 -+76 89 135 76 89 135 76 88 135 76 88 135 76 89 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 76 89 135 77 90 136 77 90 136 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 39 49 83 0 1 1 -+0 0 0 0 0 0 6 7 9 132 132 134 254 254 254 255 255 255 -+254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 -+255 255 255 255 255 255 141 141 145 6 7 9 0 0 0 0 0 0 -+0 0 0 33 41 67 75 88 134 77 90 136 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 77 90 136 78 91 137 77 90 136 -+76 89 135 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+76 90 135 77 90 136 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 89 135 76 89 135 76 88 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 75 88 134 -+75 88 134 74 87 133 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 74 87 134 73 86 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 73 86 133 72 85 132 -+73 86 133 73 86 133 70 84 131 39 55 110 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 40 57 112 -+71 84 131 72 85 132 71 85 132 70 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 70 84 131 70 84 131 69 83 130 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+69 83 131 68 82 130 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 67 81 129 68 82 130 68 82 130 68 82 130 -+68 82 130 67 81 129 70 84 131 30 48 104 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 23 39 99 61 75 125 66 80 129 66 80 129 -+66 80 129 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+63 77 126 62 76 125 56 71 121 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 23 40 100 40 57 112 -+62 76 125 61 75 125 61 75 125 61 75 125 61 75 125 60 75 125 -+59 75 125 60 75 125 60 75 125 33 41 67 0 0 0 0 0 0 -+55 55 55 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 230 230 230 20 20 21 -+0 0 0 0 0 0 25 42 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 17 26 56 0 0 1 0 0 0 66 66 66 -+243 243 243 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 255 255 255 -+31 31 31 0 0 0 0 0 0 44 57 102 54 69 120 54 69 120 -+29 46 103 25 42 101 25 42 101 22 36 89 6 7 9 0 0 0 -+20 20 21 209 209 209 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 243 243 243 80 80 80 -+0 0 0 0 0 0 33 41 67 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 48 64 117 49 65 117 29 45 103 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 43 58 114 46 61 115 45 60 114 39 56 109 -+17 26 56 0 1 1 0 0 0 0 0 0 0 0 0 0 1 1 -+44 44 44 209 209 209 255 255 255 255 255 255 254 254 254 255 255 255 -+255 255 255 248 248 248 0 0 0 0 0 0 6 8 19 24 40 99 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 36 52 108 40 56 111 -+40 56 111 40 56 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 37 53 109 27 44 103 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 27 44 102 64 78 127 -+73 86 133 73 86 133 72 85 132 73 86 133 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 73 86 134 74 87 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+74 87 133 75 88 134 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 88 135 76 89 135 76 90 135 76 89 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 76 89 135 77 90 136 77 90 136 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 77 90 136 -+78 91 137 78 91 137 78 91 137 39 49 83 0 0 0 0 0 0 -+0 0 1 44 44 44 177 177 177 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 209 209 209 44 44 44 0 0 1 -+0 0 0 0 0 0 33 41 67 76 89 135 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 77 90 136 78 91 137 -+76 89 135 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 89 135 76 88 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+75 88 134 75 88 134 74 87 133 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 74 87 134 74 87 134 73 86 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 73 86 133 73 86 133 -+72 85 132 73 86 133 72 85 132 49 64 117 23 40 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 34 50 107 -+66 80 128 72 85 132 71 85 132 70 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 70 84 131 69 83 130 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 69 83 131 -+69 83 131 68 82 130 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 68 82 130 67 81 129 68 82 130 68 82 130 -+68 82 130 68 82 130 69 83 131 40 57 112 23 40 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 23 39 99 55 69 121 66 80 129 66 80 129 -+66 80 129 66 80 128 66 80 127 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+63 77 126 63 77 126 57 72 122 27 44 102 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 36 52 108 -+62 76 125 61 75 125 61 75 125 61 75 125 61 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 42 55 96 6 7 9 0 0 0 -+31 31 31 243 243 243 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 230 230 230 66 66 66 -+0 0 0 0 0 0 18 31 73 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 15 19 34 0 0 0 0 0 0 118 119 119 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+118 119 119 0 0 0 0 0 0 31 35 49 53 68 119 55 70 121 -+29 47 104 24 41 100 25 42 101 18 31 73 2 3 5 0 0 0 -+31 31 31 254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 254 254 254 230 230 230 31 31 31 -+0 0 0 0 0 0 48 60 105 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 48 64 117 49 64 117 31 47 105 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 23 40 100 42 57 112 44 57 102 33 41 67 6 7 9 -+0 0 0 0 0 0 0 0 0 5 5 5 55 55 55 154 154 154 -+255 255 255 255 255 255 254 254 254 254 254 254 255 255 255 255 255 255 -+255 255 255 248 248 248 0 0 0 0 0 0 6 8 19 24 40 99 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 35 52 107 40 56 111 -+40 56 111 40 56 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 37 53 109 28 45 103 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 31 47 105 74 87 134 -+73 86 133 73 86 133 73 86 133 73 86 133 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+77 90 136 76 90 135 77 90 136 77 90 136 77 90 136 77 90 136 -+76 89 135 77 90 136 77 90 136 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 77 90 136 78 91 137 -+78 91 137 78 91 137 39 49 83 0 0 0 0 0 0 0 0 1 -+80 80 80 230 230 230 255 255 255 254 254 254 254 254 254 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 254 254 254 254 254 254 255 255 255 230 230 230 80 80 80 -+0 0 1 0 0 0 0 0 0 33 41 67 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+77 90 136 76 89 135 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 89 135 76 89 135 -+76 88 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 75 88 134 74 87 133 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 74 87 134 73 86 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 73 86 133 -+72 85 132 73 86 133 73 86 133 57 72 122 26 43 102 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 27 44 102 -+63 77 126 72 85 132 71 85 132 71 85 132 70 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 70 84 131 69 83 130 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+69 83 131 68 82 130 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 68 82 130 68 82 130 67 81 129 68 82 130 68 82 130 -+68 82 130 68 82 130 69 83 130 50 65 118 23 40 99 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 23 40 99 46 61 115 67 81 129 66 80 129 -+66 80 128 66 80 129 66 80 127 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 64 78 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 63 77 126 -+64 78 127 63 77 126 58 73 123 31 47 105 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 31 47 105 -+63 77 126 61 75 125 61 75 125 61 75 125 60 75 125 61 75 125 -+60 75 125 60 75 125 60 75 125 55 67 113 6 8 19 0 0 0 -+20 20 21 209 209 209 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 248 248 248 96 96 96 -+0 0 0 0 0 0 17 26 56 25 42 101 25 42 101 25 42 101 -+25 42 101 22 39 98 6 8 19 0 0 0 6 7 9 177 177 177 -+255 255 255 254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+209 209 209 0 0 0 0 0 0 6 8 19 54 69 120 55 70 121 -+33 49 106 24 41 100 25 42 101 17 26 56 0 0 0 0 0 0 -+66 66 66 255 255 255 254 254 254 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 209 209 209 0 0 0 -+0 0 0 6 7 9 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 48 64 117 48 64 117 33 49 106 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 22 36 89 17 26 56 6 8 19 0 0 0 0 0 0 -+0 0 0 0 0 0 66 66 66 154 154 154 248 248 248 255 255 255 -+255 255 255 254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 248 248 248 0 0 0 0 0 0 6 8 19 24 40 99 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 34 50 107 40 56 111 -+40 56 111 40 56 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 38 54 110 28 45 103 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 42 58 112 75 88 134 -+72 85 132 73 86 133 73 86 133 74 87 134 73 86 133 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 75 88 134 -+74 87 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 76 89 135 75 88 134 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 90 135 76 89 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+76 89 135 77 90 136 78 91 137 77 90 136 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 77 90 136 78 91 137 78 91 137 -+78 91 137 42 55 96 2 3 5 0 0 0 0 0 1 96 96 96 -+230 230 230 255 255 255 254 254 254 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 254 254 254 255 255 255 243 243 243 -+96 96 96 0 0 1 0 0 0 1 2 4 39 49 83 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 77 90 136 -+77 90 136 76 89 135 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 89 135 -+76 88 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 75 88 134 74 87 133 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 74 87 134 73 86 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 73 86 133 -+72 85 132 73 86 133 73 86 133 64 78 127 29 47 104 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 23 39 99 -+58 73 123 71 84 131 72 85 132 71 85 132 70 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 70 84 131 69 83 130 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+69 83 131 68 82 130 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 68 82 130 67 81 129 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 58 73 123 23 39 99 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 23 40 100 38 54 110 68 81 130 66 80 129 -+66 80 129 66 80 129 66 80 127 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 65 79 128 64 78 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 63 77 126 59 74 124 34 50 107 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 26 43 102 -+63 77 126 59 74 124 61 75 125 61 75 125 61 75 125 61 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 12 14 18 0 0 0 -+5 5 5 154 154 154 255 255 255 254 254 254 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 132 132 134 -+0 0 0 0 0 0 15 19 34 25 42 101 25 42 101 25 42 101 -+25 42 101 18 31 73 2 3 5 0 0 0 20 20 21 230 230 230 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 -+230 230 230 20 20 21 0 0 0 0 0 0 49 62 109 55 70 121 -+36 52 108 24 41 100 25 42 100 17 24 45 0 0 0 0 0 0 -+118 119 119 255 255 255 254 254 254 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 177 177 177 0 0 0 -+0 0 0 17 24 45 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 48 64 117 48 64 117 35 52 107 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 99 17 24 45 0 0 0 0 0 0 0 0 0 0 0 0 -+44 44 44 177 177 177 243 243 243 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 248 248 248 0 0 0 0 0 0 6 8 19 24 40 99 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 33 49 106 40 56 111 -+40 56 111 40 56 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 38 54 110 29 46 104 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 23 40 100 55 70 121 74 87 134 -+73 86 133 73 86 133 73 86 133 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 73 86 134 74 87 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 74 87 133 -+75 88 134 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 88 135 76 89 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 78 91 137 77 90 136 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 77 90 136 78 91 137 78 91 137 78 91 137 -+59 73 120 12 14 18 0 0 0 0 0 0 66 66 66 243 243 243 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+243 243 243 80 80 80 0 0 0 0 0 0 6 7 9 55 67 113 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 77 90 136 76 89 135 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 89 135 76 90 135 -+76 89 135 76 88 135 76 89 135 76 89 135 76 89 135 76 89 135 -+75 88 134 76 89 135 75 88 134 74 87 133 75 88 134 75 88 134 -+75 88 134 75 88 134 74 87 134 75 88 134 74 87 134 73 86 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 73 86 133 -+72 85 132 72 85 132 73 86 133 71 84 131 34 50 107 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 23 40 99 -+48 64 117 71 84 131 72 85 132 71 85 132 70 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 70 84 131 -+69 83 130 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+69 83 131 68 82 130 68 82 130 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 68 82 130 67 81 129 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 66 80 128 23 39 99 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 32 48 107 68 82 130 65 79 128 -+66 80 129 66 80 129 66 80 127 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 64 78 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 63 77 126 61 75 125 37 53 109 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+60 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 31 35 49 0 0 0 -+0 0 0 118 119 119 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 177 177 177 -+6 7 9 0 0 0 6 8 19 25 42 101 25 42 101 25 42 101 -+25 42 101 17 26 56 0 0 0 0 0 0 44 44 44 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+243 243 243 80 80 80 0 0 0 0 0 0 33 41 67 55 70 121 -+38 54 109 24 41 100 24 40 99 15 19 34 0 0 0 0 0 0 -+177 177 177 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 254 254 254 255 255 255 96 96 96 0 0 0 -+0 0 0 33 41 67 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 48 64 117 49 65 117 48 64 117 37 53 109 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 99 17 24 45 0 0 0 0 0 0 20 20 21 154 154 154 -+254 254 254 255 255 255 254 254 254 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 248 248 248 0 0 0 0 0 0 6 8 19 24 40 99 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 32 48 105 40 56 111 -+40 56 111 40 56 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 38 54 110 29 46 104 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 23 39 99 67 81 129 73 86 133 -+73 86 133 72 85 132 73 86 133 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 73 86 134 75 88 134 74 87 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 74 87 133 -+76 89 135 75 88 134 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 88 135 76 90 135 76 89 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 77 90 136 76 90 135 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 76 89 135 -+77 90 136 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 76 89 135 -+31 35 49 0 0 0 0 0 1 31 31 31 230 230 230 255 255 255 -+254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 -+255 255 255 230 230 230 31 31 31 0 0 1 0 0 0 17 24 45 -+73 87 131 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 77 90 136 77 90 136 76 89 135 77 90 136 77 90 136 -+77 90 136 77 90 136 76 90 135 77 90 136 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 89 135 76 88 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 75 88 134 74 87 133 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 74 87 134 73 86 134 -+74 87 134 74 87 134 74 87 134 74 87 134 73 86 133 74 87 134 -+73 86 133 72 85 132 72 85 132 75 88 134 40 56 111 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 23 40 100 -+39 55 110 71 84 131 72 85 132 71 85 132 70 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 70 84 131 -+69 83 130 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 69 83 131 68 82 130 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 68 82 130 67 81 129 68 82 130 68 82 130 -+68 82 130 68 82 130 67 81 129 68 82 130 26 43 102 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 26 43 101 68 82 130 66 80 129 -+66 80 129 66 80 129 66 80 127 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 64 78 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 64 78 127 -+63 77 126 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 63 77 126 62 76 125 40 56 111 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+57 72 122 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 39 49 83 0 1 1 -+0 0 0 80 80 80 243 243 243 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 209 209 209 -+20 20 21 0 0 0 6 7 9 22 36 89 25 42 101 25 42 101 -+24 41 99 15 19 34 0 0 0 0 0 0 118 119 119 255 255 255 -+254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 132 132 134 0 0 0 0 0 0 15 19 34 55 70 121 -+40 56 111 24 41 100 22 36 89 6 8 19 0 0 0 0 0 0 -+230 230 230 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 254 254 254 255 255 255 31 31 31 0 0 0 -+0 0 0 44 57 102 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 38 54 109 -+23 40 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 99 17 24 45 0 0 0 0 0 0 154 154 154 255 255 255 -+255 255 255 254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 248 248 248 0 0 0 0 0 0 6 8 19 24 40 99 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 32 48 105 40 56 111 -+40 56 111 40 56 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 38 54 111 29 46 104 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 26 43 102 74 87 134 73 86 133 -+73 86 133 72 85 132 74 87 134 73 86 133 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 73 86 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 74 87 133 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 88 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 76 89 135 -+78 91 137 77 90 136 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 49 61 101 -+0 0 0 0 0 0 0 0 1 177 177 177 255 255 255 254 254 254 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+254 254 254 255 255 255 209 209 209 2 3 5 0 0 0 0 0 0 -+39 49 83 77 90 136 78 91 137 78 91 137 78 91 137 78 91 137 -+77 90 136 78 91 137 77 90 136 76 89 135 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 89 135 76 88 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 75 88 134 74 87 133 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 74 87 134 73 86 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+73 86 133 72 85 132 72 85 132 74 87 134 49 64 117 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+29 47 104 71 84 131 72 85 132 71 85 132 70 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 70 84 131 -+69 83 130 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 69 83 131 68 82 130 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 68 82 130 68 82 130 67 81 129 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 32 50 106 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 64 78 127 66 80 129 -+66 80 129 66 80 129 66 80 127 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 64 78 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 64 78 127 65 79 128 -+63 77 126 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 63 77 126 63 77 126 43 58 114 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+53 67 120 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 49 62 109 0 0 0 -+0 0 0 44 44 44 230 230 230 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 230 230 230 -+44 44 44 0 0 0 2 3 5 18 31 73 25 42 101 25 42 101 -+22 36 89 6 8 19 0 0 0 0 0 0 209 209 209 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 177 177 177 12 14 18 0 0 0 6 7 9 49 65 116 -+42 58 112 24 41 100 22 36 89 0 1 1 0 0 0 6 7 9 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 243 243 243 0 0 0 0 0 0 -+6 7 9 47 62 113 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 40 56 111 -+23 40 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 99 17 24 45 0 0 0 0 0 0 146 146 148 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 248 248 248 0 0 0 0 0 0 6 8 19 24 40 99 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 31 47 105 40 56 111 -+40 56 111 40 56 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 29 47 104 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 23 40 100 37 53 109 74 87 134 72 85 132 -+73 86 133 72 85 132 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 73 86 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 74 87 133 75 88 134 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 88 135 76 89 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 76 89 135 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 77 90 136 78 91 137 78 91 137 77 90 136 6 7 9 -+0 0 0 0 0 1 137 138 138 255 255 255 254 254 254 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 254 254 254 255 255 255 146 146 148 0 0 1 0 0 0 -+2 3 5 73 86 133 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 74 87 134 73 86 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+73 86 133 72 85 132 73 86 133 74 87 133 59 74 124 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+23 40 99 70 84 131 72 85 132 72 85 132 71 85 132 70 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 70 84 131 -+69 83 130 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 69 83 131 68 82 130 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 68 82 130 67 81 129 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 38 54 110 23 40 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 59 74 124 66 80 129 -+66 80 129 66 80 129 66 80 128 66 80 127 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 64 78 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+63 77 126 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 63 77 126 63 77 126 45 60 114 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+50 65 118 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 6 7 9 -+0 0 0 0 0 0 209 209 209 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+55 55 55 0 0 0 1 2 4 17 26 56 25 42 101 25 42 101 -+22 36 89 0 0 0 0 0 0 12 14 18 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 230 230 230 44 44 44 0 0 0 2 3 5 39 49 83 -+45 60 114 24 41 100 18 31 73 0 0 0 0 0 0 66 66 66 -+255 255 255 254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 177 177 177 0 0 0 0 0 0 -+15 19 34 47 63 116 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 42 58 112 -+23 40 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 99 17 24 45 0 0 0 0 0 0 146 146 148 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 248 248 248 0 0 0 0 0 0 6 8 19 24 40 99 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 30 46 104 40 56 111 -+40 56 111 40 56 111 39 55 111 38 54 111 39 55 111 39 55 111 -+39 55 111 38 54 110 39 55 111 29 47 104 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 23 40 99 46 61 115 74 87 133 73 86 133 -+73 86 133 72 85 132 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 73 86 134 74 87 134 74 87 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 74 87 133 75 88 134 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 88 135 76 89 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 76 89 135 77 90 136 -+77 90 136 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+77 90 136 78 91 137 78 91 137 78 91 137 33 41 67 0 0 0 -+0 0 0 55 55 55 243 243 243 255 255 255 254 254 254 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 254 254 254 255 255 255 243 243 243 55 55 55 0 0 0 -+0 0 0 33 41 67 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 75 88 134 55 67 113 42 55 96 -+39 49 83 33 41 67 33 41 67 39 49 83 49 61 101 67 81 125 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+73 86 133 73 86 133 73 86 133 73 86 133 67 80 128 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+23 39 99 63 77 126 72 85 132 72 85 132 71 85 132 70 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 70 84 131 -+69 83 130 69 83 130 70 84 131 70 84 131 70 84 131 70 84 131 -+59 73 120 49 61 101 39 49 83 33 41 67 33 41 67 33 41 67 -+33 41 67 33 41 67 39 49 83 42 55 96 49 61 101 63 77 126 -+68 82 130 68 82 130 68 82 130 68 82 130 44 60 113 23 40 99 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 54 69 120 67 81 129 -+66 80 129 66 80 129 66 80 128 66 80 127 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 64 78 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+63 77 126 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 63 77 126 63 77 126 47 63 116 25 42 101 24 41 100 -+25 42 101 22 36 89 18 31 73 17 26 56 17 26 56 17 24 45 -+17 26 56 17 26 56 18 31 73 22 39 98 25 42 101 24 41 100 -+47 63 116 62 76 125 61 75 125 61 75 125 61 75 125 61 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 17 24 45 -+0 0 0 0 0 0 154 154 154 254 254 254 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+96 96 96 0 0 0 0 0 0 17 24 45 25 42 101 25 42 101 -+17 26 56 0 0 0 0 0 0 96 96 96 255 255 255 254 254 254 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 66 66 66 0 0 0 0 0 0 31 35 49 -+46 61 115 24 41 100 17 26 56 0 0 0 0 0 0 132 132 134 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 118 119 119 0 0 0 0 0 0 -+33 41 67 49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 43 59 113 -+23 40 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 22 36 89 17 26 56 17 24 45 17 24 45 -+17 26 56 18 31 73 24 40 99 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 100 17 24 45 0 0 0 0 0 0 146 146 148 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 248 248 248 0 0 0 0 0 0 6 8 19 24 40 99 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 29 46 104 40 56 111 -+40 56 111 40 56 111 40 56 111 38 54 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 31 47 105 24 41 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 23 39 99 56 71 121 73 86 133 73 86 133 -+72 85 132 73 86 133 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 73 86 134 74 87 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 74 87 133 75 88 134 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 88 135 76 89 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 76 89 135 77 90 136 77 90 136 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+77 90 136 78 91 137 78 91 137 73 86 130 6 7 9 0 0 1 -+0 0 0 177 177 177 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 248 248 248 230 230 230 177 177 177 -+96 96 96 66 66 66 44 44 44 55 55 55 80 80 80 118 119 119 -+177 177 177 230 230 230 251 251 251 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 177 177 177 0 0 0 -+0 0 1 2 3 5 73 86 130 78 91 137 78 91 137 78 91 137 -+77 90 136 42 55 96 33 41 67 33 41 67 33 41 67 33 41 67 -+33 41 67 33 41 67 33 41 67 33 41 67 33 41 67 33 41 67 -+33 41 67 33 41 67 33 41 67 33 41 67 33 41 67 33 41 67 -+33 41 67 33 41 67 33 41 67 39 49 83 75 88 134 74 87 133 -+67 81 125 39 49 83 15 19 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 -+2 3 5 31 35 49 49 61 101 67 81 125 74 87 133 73 86 133 -+74 87 134 73 86 133 73 86 133 73 86 133 74 87 134 26 43 102 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+23 39 99 54 69 120 73 85 132 72 85 132 71 85 132 70 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 70 84 131 71 85 132 -+67 81 125 59 73 120 49 61 101 31 35 49 12 14 18 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 3 5 15 19 34 33 41 67 49 61 101 44 57 102 22 39 98 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 49 65 117 67 81 129 -+66 80 129 66 80 129 66 80 128 49 61 101 33 41 67 33 41 67 -+33 41 67 33 41 67 33 41 67 33 41 67 33 41 67 33 41 67 -+33 41 67 33 41 67 33 41 67 33 41 67 33 41 67 33 41 67 -+33 41 67 33 41 67 33 41 67 33 41 67 33 41 67 39 49 83 -+59 73 120 64 78 127 62 76 125 44 57 102 18 31 73 15 19 34 -+1 2 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 6 7 9 17 24 45 -+42 55 96 58 72 120 61 75 125 61 75 125 61 75 125 61 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 33 41 67 -+0 0 0 0 0 0 96 96 96 254 254 254 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+141 141 145 0 1 1 0 0 0 15 19 34 24 41 99 25 42 101 -+6 8 19 0 0 0 0 0 0 177 177 177 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+254 254 254 255 255 255 132 132 134 1 2 4 0 0 0 15 19 34 -+46 61 113 24 41 100 15 19 34 0 0 0 0 0 0 177 177 177 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 44 44 44 0 0 0 0 0 0 -+39 49 83 44 58 112 17 26 56 17 26 56 17 26 56 17 26 56 -+17 26 56 17 26 56 17 26 56 17 26 56 17 26 56 17 26 56 -+17 26 56 17 26 56 17 26 56 17 26 56 17 26 56 17 26 56 -+17 24 45 17 24 45 17 24 45 17 24 45 18 31 73 22 36 89 -+17 24 45 1 2 4 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 6 8 19 17 26 56 22 36 89 -+24 41 99 22 36 89 17 24 45 17 24 45 17 24 45 17 24 45 -+17 24 45 6 8 19 0 0 0 0 0 0 146 146 148 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 248 248 248 0 0 0 0 0 0 2 3 5 17 24 45 -+17 24 45 17 24 45 17 24 45 17 24 45 17 24 45 17 24 45 -+17 24 45 18 31 73 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 29 45 103 40 56 111 -+40 56 111 40 56 111 40 56 111 38 54 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 31 47 105 24 41 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 22 39 98 64 78 127 73 86 133 73 86 133 -+72 85 132 73 86 133 73 86 133 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 73 86 134 74 87 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 74 87 133 75 88 134 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 88 135 -+76 89 135 76 89 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 76 89 135 77 90 136 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 77 90 136 -+78 91 137 78 91 137 78 91 137 39 49 83 1 2 4 0 0 1 -+55 55 55 230 230 230 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+254 254 254 255 255 255 209 209 209 118 119 119 12 14 18 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 31 31 132 132 134 230 230 230 255 255 255 254 254 254 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 230 230 230 55 55 55 -+0 0 1 0 1 1 33 41 67 78 91 137 78 91 137 78 91 137 -+76 89 135 17 24 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 15 19 34 49 61 101 33 41 67 -+6 7 9 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 12 14 18 33 41 67 67 81 125 -+74 87 134 73 86 133 73 86 133 72 85 132 76 88 135 33 49 106 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+23 40 99 46 61 115 73 86 133 72 85 132 71 85 132 70 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 62 76 125 39 49 83 -+17 24 45 6 7 9 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 6 7 9 15 19 34 -+17 26 56 22 36 89 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 46 61 115 68 81 130 -+66 80 129 66 80 129 66 80 128 33 41 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 12 14 18 -+59 73 120 49 61 101 31 35 49 6 7 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 15 19 34 39 49 83 61 75 125 61 75 125 61 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 49 62 109 -+0 0 0 0 0 0 44 44 44 254 254 254 254 254 254 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+177 177 177 2 3 5 0 0 0 6 8 19 22 36 89 24 41 99 -+0 0 0 0 0 0 0 0 0 243 243 243 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 209 209 209 5 5 5 0 0 0 6 8 19 -+44 57 102 24 41 100 6 7 9 0 0 0 0 0 0 243 243 243 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 243 243 243 6 7 9 0 0 0 6 7 9 -+42 55 96 44 57 102 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 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 8 19 1 2 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 1 1 -+15 19 34 15 19 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 146 146 148 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 248 248 248 0 0 0 0 0 0 0 0 0 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 26 56 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 28 45 103 40 56 111 -+40 56 111 40 56 111 40 56 111 38 54 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 31 47 105 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 68 82 130 73 86 133 73 86 133 -+72 85 132 73 86 133 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 73 86 134 74 87 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 74 87 133 75 88 134 75 88 134 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 88 135 -+76 89 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 76 89 135 77 90 136 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 77 90 136 -+78 91 137 78 91 137 74 87 130 15 19 34 0 0 0 2 3 5 -+132 132 134 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 -+255 255 255 177 177 177 31 31 31 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 1 0 0 0 44 44 44 209 209 209 255 255 255 -+254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 132 132 134 -+2 3 5 0 0 0 15 19 34 74 87 133 78 91 137 78 91 137 -+76 89 135 17 24 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 6 7 9 6 7 9 0 0 0 -+0 0 0 0 0 1 0 0 1 0 0 0 55 55 55 96 96 96 -+132 132 134 137 138 138 137 138 138 118 119 119 96 96 96 55 55 55 -+0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 12 14 18 -+42 55 96 73 86 133 73 86 133 73 86 133 75 88 134 42 57 112 -+23 40 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+23 40 100 38 54 110 73 86 133 72 85 132 71 85 132 70 85 132 -+71 85 132 71 85 132 70 84 131 33 41 67 12 14 18 0 1 1 -+0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 12 14 18 -+55 55 55 96 96 96 118 119 119 132 132 134 137 138 138 141 141 145 -+137 138 138 132 132 134 118 119 119 96 96 96 66 66 66 44 44 44 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 1 6 8 19 17 24 45 24 41 99 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 40 57 112 68 81 130 -+66 80 129 66 80 129 66 80 128 33 41 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 15 19 34 -+33 41 67 6 8 19 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 44 44 44 96 96 96 118 119 119 132 132 134 137 138 138 -+132 132 134 118 119 119 80 80 80 31 31 31 0 0 0 0 0 0 -+0 0 0 0 0 0 2 3 5 17 24 45 56 69 119 61 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+5 5 5 0 0 0 0 0 0 243 243 243 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+243 243 243 1 2 4 0 0 0 6 7 9 22 36 89 18 31 73 -+0 0 0 0 0 0 66 66 66 251 251 251 254 254 254 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 20 20 21 0 0 0 0 0 0 -+39 49 83 24 40 99 0 0 0 0 0 0 31 31 31 248 248 248 -+254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 177 177 177 5 5 5 0 0 0 12 14 18 -+49 62 109 44 57 102 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+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 55 55 118 119 119 137 138 138 137 138 138 -+118 119 119 80 80 80 20 20 21 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 141 141 145 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 248 248 248 0 0 0 0 0 0 0 0 0 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 26 56 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 27 44 103 40 56 111 -+40 56 111 40 56 111 40 56 111 38 54 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 32 48 107 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 29 46 104 70 84 131 73 86 133 73 86 133 -+72 85 132 73 86 133 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 73 86 134 73 86 134 74 87 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 74 87 133 75 88 134 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 88 135 -+76 89 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 76 89 135 76 89 135 77 90 136 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 77 90 136 77 90 136 -+78 91 137 78 91 137 55 67 113 6 7 9 0 0 0 12 14 18 -+230 230 230 255 255 255 254 254 254 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 255 255 255 -+177 177 177 0 0 0 0 0 1 0 0 0 0 0 0 15 19 34 -+49 61 101 67 81 125 76 90 135 74 87 130 59 73 120 39 49 83 -+12 14 18 0 0 0 0 0 1 0 0 1 5 5 5 209 209 209 -+255 255 255 254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 254 254 254 255 255 255 209 209 209 -+20 20 21 0 0 0 6 7 9 55 67 113 78 91 137 78 91 137 -+76 89 135 17 24 45 0 0 0 1 2 4 96 96 96 154 154 154 -+154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 -+154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 -+118 119 119 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 -+0 0 1 55 55 55 177 177 177 243 243 243 248 248 248 251 251 251 -+251 251 251 254 254 254 251 251 251 251 251 251 251 251 251 248 248 248 -+243 243 243 154 154 154 31 31 31 0 0 1 0 0 0 0 0 0 -+0 0 0 31 35 49 73 86 133 73 86 133 74 87 134 49 64 117 -+23 40 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 32 48 105 74 87 133 72 85 132 71 85 132 71 85 132 -+71 85 132 49 61 101 6 8 19 0 1 1 0 0 0 0 0 0 -+0 0 1 0 0 0 55 55 55 146 146 148 230 230 230 248 248 248 -+248 248 248 251 251 251 251 251 251 251 251 251 251 251 251 254 254 254 -+251 251 251 251 251 251 251 251 251 251 251 251 248 248 248 248 248 248 -+243 243 243 209 209 209 132 132 134 44 44 44 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 6 7 9 22 36 89 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 38 54 110 68 82 130 -+66 80 129 66 80 129 66 80 128 33 41 67 0 0 0 0 0 0 -+66 66 66 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 -+154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 -+154 154 154 154 154 154 132 132 134 0 0 0 0 0 0 0 1 1 -+0 1 1 0 0 0 0 0 0 0 0 0 44 44 44 154 154 154 -+243 243 243 248 248 248 251 251 251 251 251 251 251 251 251 254 254 254 -+251 251 251 251 251 251 248 248 248 248 248 248 209 209 209 118 119 119 -+0 1 1 0 0 0 0 0 0 0 0 0 12 14 18 55 67 113 -+61 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+15 19 34 0 0 0 0 0 0 177 177 177 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 31 31 31 0 0 0 0 0 0 22 36 89 15 19 34 -+0 0 0 0 0 0 137 138 138 254 254 254 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 254 254 254 255 255 255 96 96 96 0 0 0 0 0 0 -+33 41 67 18 31 73 0 0 0 0 0 0 80 80 80 251 251 251 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+254 254 254 255 255 255 132 132 134 2 3 5 0 0 0 15 19 34 -+51 66 119 44 57 102 0 0 0 0 0 0 44 44 44 146 146 148 -+154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 -+154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 -+146 146 148 66 66 66 0 0 0 0 0 0 0 0 0 0 0 0 -+96 96 96 230 230 230 248 248 248 251 251 251 251 251 251 254 254 254 -+251 251 251 248 248 248 248 248 248 209 209 209 80 80 80 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 66 66 66 154 154 154 -+154 154 154 154 154 154 154 154 154 154 154 154 209 209 209 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 251 251 251 146 146 148 154 154 154 154 154 154 154 154 154 -+154 154 154 154 154 154 154 154 154 154 154 154 80 80 80 0 0 0 -+0 0 0 17 26 56 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 27 44 103 40 56 111 -+40 56 111 40 56 111 40 56 111 38 54 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 32 50 106 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 34 50 107 70 84 131 73 86 133 73 86 133 -+72 85 132 73 86 133 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 73 86 134 74 87 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 74 87 133 75 88 134 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 88 135 -+76 89 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 76 89 135 77 90 136 78 91 137 77 90 136 -+78 91 137 78 91 137 78 91 137 78 91 137 77 90 136 78 91 137 -+78 91 137 78 91 137 39 49 83 0 0 0 0 0 0 55 55 55 -+255 255 255 254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 254 254 254 255 255 255 209 209 209 -+6 7 9 0 0 0 0 0 0 6 8 19 67 77 99 82 95 139 -+82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 -+82 95 139 42 55 96 6 7 9 0 0 0 0 0 0 20 20 21 -+243 243 243 255 255 255 254 254 254 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+55 55 55 0 0 0 0 0 0 39 49 83 78 91 137 78 91 137 -+76 89 135 17 24 45 0 0 0 5 5 5 154 154 154 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+209 209 209 0 0 0 0 0 0 0 0 0 0 0 0 31 31 31 -+177 177 177 255 255 255 255 255 255 255 255 255 254 254 254 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 -+255 255 255 255 255 255 255 255 255 154 154 154 31 31 31 0 0 0 -+0 0 1 0 0 0 31 35 49 71 84 128 74 87 133 56 71 121 -+23 40 99 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 27 43 102 74 87 133 71 84 131 72 85 132 69 82 127 -+33 41 67 0 0 0 0 0 0 0 0 1 1 2 4 31 31 31 -+118 119 119 230 230 230 255 255 255 255 255 255 255 255 255 254 254 254 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 -+255 255 255 255 255 255 255 255 255 255 255 255 230 230 230 118 119 119 -+31 31 31 1 2 4 0 0 0 0 0 0 0 0 0 17 26 56 -+24 41 99 25 42 101 25 42 101 24 41 100 35 52 107 68 82 130 -+66 80 129 66 80 129 66 80 128 33 41 67 0 0 0 0 0 0 -+118 119 119 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 230 230 230 0 0 0 0 0 0 0 0 0 -+0 0 0 0 1 1 44 44 44 177 177 177 255 255 255 255 255 255 -+255 255 255 254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 254 254 254 255 255 255 255 255 255 -+243 243 243 80 80 80 5 5 5 0 0 0 0 0 0 12 14 18 -+55 67 113 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+33 41 67 0 0 0 0 0 0 118 119 119 255 255 255 254 254 254 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 80 80 80 0 0 0 0 0 0 18 31 73 2 3 5 -+0 0 0 0 0 0 209 209 209 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 177 177 177 0 0 0 0 0 0 -+15 19 34 17 26 56 0 0 0 0 0 0 118 119 119 251 251 251 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 80 80 80 0 0 0 0 0 0 17 26 56 -+51 66 119 44 57 102 0 0 0 0 0 0 66 66 66 254 254 254 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+254 254 254 96 96 96 0 0 0 0 0 0 20 20 21 154 154 154 -+255 255 255 255 255 255 254 254 254 255 255 255 255 255 255 255 255 255 -+255 255 255 254 254 254 254 254 254 255 255 255 255 255 255 230 230 230 -+66 66 66 0 0 0 0 0 0 0 0 0 93 98 116 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 132 132 134 0 0 0 -+0 0 0 17 26 56 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 26 43 102 40 56 111 -+40 56 111 40 56 111 40 56 111 38 54 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 32 50 106 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 23 40 100 39 55 110 71 84 131 73 86 133 73 86 133 -+72 85 132 73 86 133 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 73 86 134 74 87 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 74 87 133 75 88 134 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 88 135 76 89 135 -+76 89 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 77 90 136 76 90 135 77 90 136 77 90 136 -+77 90 136 77 90 136 76 89 135 77 90 136 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 77 90 136 78 91 137 -+78 91 137 76 89 135 31 35 49 0 0 0 0 0 1 154 154 154 -+255 255 255 254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 248 248 248 80 80 80 -+0 0 0 0 0 0 12 14 18 67 81 125 82 95 139 82 95 139 -+82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 -+82 95 139 80 93 136 67 77 99 6 8 19 0 0 0 0 0 0 -+96 96 96 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 255 255 255 -+137 138 138 0 0 1 0 0 0 31 35 49 75 88 134 78 91 137 -+76 89 135 17 24 45 0 0 0 5 5 5 154 154 154 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+209 209 209 0 0 0 0 0 0 1 2 4 96 96 96 248 248 248 -+255 255 255 255 255 255 254 254 254 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 254 254 254 254 254 254 255 255 255 230 230 230 96 96 96 -+0 0 0 0 0 0 0 0 0 31 35 49 72 85 132 61 75 125 -+23 39 99 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 72 85 132 72 85 132 62 76 125 31 35 49 -+0 0 0 0 0 0 0 0 1 31 31 31 132 132 134 230 230 230 -+255 255 255 255 255 255 254 254 254 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+230 230 230 132 132 134 31 31 31 0 0 0 0 0 0 0 0 0 -+15 19 34 22 39 98 25 42 101 24 41 100 32 50 106 68 82 130 -+65 79 128 66 80 129 66 80 128 33 41 67 0 0 0 0 0 0 -+118 119 119 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 230 230 230 0 0 0 0 0 0 0 0 0 -+6 7 9 118 119 119 243 243 243 255 255 255 255 255 255 254 254 254 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 -+255 255 255 255 255 255 146 146 148 6 7 9 0 0 0 0 0 0 -+17 24 45 59 74 124 60 75 125 60 75 125 60 75 125 60 75 125 -+42 55 96 0 0 0 0 0 0 44 44 44 255 255 255 254 254 254 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 146 146 148 0 0 0 0 0 0 6 8 19 0 0 0 -+0 0 0 44 44 44 230 230 230 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 251 251 251 0 0 0 0 0 0 -+1 2 4 6 8 19 0 0 0 0 0 0 177 177 177 254 254 254 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 243 243 243 55 55 55 0 0 0 1 2 4 33 41 67 -+51 66 119 44 57 102 0 0 0 0 0 0 66 66 66 248 248 248 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+248 248 248 96 96 96 0 0 0 5 5 5 177 177 177 255 255 255 -+255 255 255 254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+80 80 80 0 0 0 0 0 0 0 0 0 96 96 96 248 248 248 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 132 132 134 0 0 0 -+0 0 0 17 26 56 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 26 44 102 40 56 111 -+40 56 111 40 56 111 40 56 111 38 54 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 33 49 106 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 23 40 100 42 58 112 71 85 132 73 86 133 72 85 132 -+73 86 133 73 86 133 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 73 86 134 74 87 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 74 87 133 75 88 134 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 88 135 76 89 135 -+76 90 135 76 89 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 76 89 135 77 90 136 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 74 87 130 12 14 18 0 0 0 0 0 0 243 243 243 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 209 209 209 12 14 18 -+0 0 1 1 2 4 49 61 101 82 95 139 82 95 139 82 95 139 -+82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 -+82 95 139 82 95 139 80 93 136 39 49 83 2 3 5 0 0 1 -+20 20 21 209 209 209 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+230 230 230 0 0 0 0 0 0 20 20 21 71 84 128 78 91 137 -+76 89 135 17 24 45 0 0 0 5 5 5 154 154 154 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+209 209 209 0 0 0 2 3 5 132 132 134 251 251 251 255 255 255 -+254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 248 248 248 -+118 119 119 0 0 1 0 0 0 0 0 0 39 49 83 67 80 128 -+23 39 99 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 68 81 130 59 73 120 15 19 34 0 0 0 -+0 0 1 0 0 1 96 96 96 209 209 209 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 254 254 254 -+255 255 255 255 255 255 209 209 209 80 80 80 0 0 0 0 0 0 -+0 0 0 15 19 34 24 41 99 25 42 101 31 47 105 67 81 129 -+66 80 129 66 80 129 66 80 128 33 41 67 0 0 0 0 0 0 -+118 119 119 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 230 230 230 0 0 0 0 0 0 12 14 18 -+177 177 177 255 255 255 255 255 255 254 254 254 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+254 254 254 255 255 255 255 255 255 177 177 177 0 0 0 0 0 0 -+0 0 0 33 41 67 60 75 125 60 75 125 60 75 125 60 75 125 -+49 62 109 6 7 9 0 0 0 0 0 0 251 251 251 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 209 209 209 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 80 80 80 248 248 248 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 254 254 254 255 255 255 66 66 66 0 0 0 -+0 0 0 0 0 1 0 0 0 6 7 9 209 209 209 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 209 209 209 31 31 31 0 0 0 2 3 5 42 55 96 -+51 66 119 44 57 102 0 0 0 0 0 0 66 66 66 248 248 248 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+248 248 248 96 96 96 0 0 0 154 154 154 255 255 255 254 254 254 -+254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 209 209 209 -+20 20 21 0 0 0 0 0 0 0 0 0 96 96 96 248 248 248 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 132 132 134 0 0 0 -+0 0 0 17 26 56 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 26 43 102 40 56 111 -+40 56 111 40 56 111 40 56 111 38 54 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 33 49 106 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 23 40 100 45 60 114 72 85 132 73 86 133 72 85 132 -+73 86 133 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 73 86 134 74 87 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 74 87 133 75 88 134 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 88 135 76 89 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 71 84 128 0 0 0 0 0 0 31 31 31 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 251 251 251 132 132 134 0 0 0 -+0 0 0 15 19 34 82 95 139 82 95 139 82 95 139 82 95 139 -+82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 -+82 95 139 82 95 139 82 95 139 80 93 136 12 14 18 0 0 0 -+0 0 0 141 141 145 254 254 254 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 6 7 9 0 0 0 0 1 1 67 81 125 78 91 137 -+76 89 135 17 24 45 0 0 0 5 5 5 154 154 154 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+209 209 209 0 0 0 118 119 119 255 255 255 255 255 255 254 254 254 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 254 254 254 254 254 254 255 255 255 -+255 255 255 96 96 96 0 0 1 0 0 0 0 0 0 55 67 113 -+23 39 99 24 41 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 59 73 120 17 24 45 0 0 0 0 0 1 -+0 1 1 132 132 134 248 248 248 255 255 255 255 255 255 254 254 254 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+254 254 254 255 255 255 255 255 255 254 254 254 118 119 119 0 0 0 -+0 0 0 0 0 0 15 19 34 25 42 101 31 47 105 65 79 128 -+66 80 129 66 80 129 66 80 128 33 41 67 0 0 0 0 0 0 -+118 119 119 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 230 230 230 0 0 0 12 14 18 177 177 177 -+255 255 255 255 255 255 254 254 254 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 254 254 254 255 255 255 255 255 255 154 154 154 0 0 0 -+0 0 0 0 1 1 55 67 113 60 75 125 60 75 125 60 75 125 -+56 69 119 15 19 34 0 0 0 0 0 0 177 177 177 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+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 1 1 132 132 134 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 154 154 154 0 0 0 -+0 0 0 0 0 0 0 0 0 31 31 31 209 209 209 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 177 177 177 6 7 9 0 0 0 6 7 9 42 57 112 -+51 66 119 44 57 102 0 0 0 0 0 0 66 66 66 248 248 248 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+248 248 248 96 96 96 80 80 80 248 248 248 255 255 255 254 254 254 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 251 251 251 132 132 134 -+0 0 0 0 0 0 0 0 0 0 0 0 96 96 96 248 248 248 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 132 132 134 0 0 0 -+0 0 0 17 26 56 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 43 102 40 56 111 -+40 56 111 40 56 111 40 56 111 38 54 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 33 49 106 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 23 40 99 48 63 117 72 85 132 73 86 133 72 85 132 -+73 86 133 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 73 86 134 74 87 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 74 87 133 75 88 134 75 88 134 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 88 135 76 89 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 78 91 137 77 90 136 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 49 61 101 0 0 0 0 0 1 96 96 96 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 254 254 254 243 243 243 55 55 55 0 0 1 -+0 0 0 49 61 101 82 95 139 82 95 139 82 95 139 82 95 139 -+82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 -+82 95 139 82 95 139 82 95 139 82 95 139 39 49 83 0 0 0 -+0 0 1 80 80 80 243 243 243 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 66 66 66 0 0 1 0 0 0 55 67 113 78 91 137 -+76 89 135 17 24 45 0 0 0 5 5 5 154 154 154 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+209 209 209 80 80 80 255 255 255 255 255 255 254 254 254 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+254 254 254 255 255 255 55 55 55 0 0 1 0 0 0 12 14 18 -+23 40 99 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 99 33 41 67 0 0 0 0 0 1 5 5 5 -+132 132 134 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 254 254 254 254 254 254 255 255 255 118 119 119 -+0 0 0 0 0 0 0 0 0 17 26 56 31 47 105 64 78 128 -+66 80 129 66 80 129 66 80 128 33 41 67 0 0 0 0 0 0 -+118 119 119 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 230 230 230 5 5 5 154 154 154 255 255 255 -+254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 254 254 254 243 243 243 66 66 66 -+0 0 0 0 0 0 31 35 49 60 75 125 60 75 125 60 75 125 -+59 74 124 31 35 49 0 0 0 0 0 0 132 132 134 255 255 255 -+254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+254 254 254 255 255 255 44 44 44 0 0 0 0 0 0 0 0 0 -+12 14 18 177 177 177 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 251 251 251 254 254 254 254 254 254 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 209 209 209 0 0 0 -+0 0 0 0 0 0 0 0 0 66 66 66 230 230 230 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 137 138 138 0 0 0 0 0 0 15 19 34 40 57 112 -+51 66 119 44 57 102 0 0 0 0 0 0 66 66 66 248 248 248 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+248 248 248 118 119 119 209 209 209 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 230 230 230 31 31 31 -+0 0 0 0 0 0 0 0 0 0 0 0 96 96 96 248 248 248 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 132 132 134 0 0 0 -+0 0 0 17 26 56 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 43 102 40 56 111 -+40 56 111 40 56 111 40 56 111 38 54 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 34 50 107 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 23 40 99 50 65 118 72 85 132 73 86 133 72 85 132 -+73 86 133 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 73 86 134 74 87 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 74 87 133 75 88 134 76 89 135 75 88 134 -+76 89 135 76 89 135 76 89 135 76 89 135 76 88 135 76 89 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 39 49 83 0 0 0 0 0 0 146 146 148 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 230 230 230 0 1 1 0 0 0 -+0 0 1 82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 -+82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 -+82 95 139 82 95 139 82 95 139 82 95 139 76 90 135 0 0 0 -+0 0 0 20 20 21 230 230 230 254 254 254 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 118 119 119 0 0 0 0 0 0 39 49 83 78 91 137 -+76 89 135 17 24 45 0 0 0 5 5 5 154 154 154 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+230 230 230 251 251 251 255 255 255 254 254 254 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+254 254 254 255 255 255 209 209 209 20 20 21 0 0 1 0 0 0 -+17 26 56 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 18 31 73 0 0 0 0 0 0 0 0 1 118 119 119 -+255 255 255 255 255 255 254 254 254 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 254 254 254 254 254 254 255 255 255 -+118 119 119 0 0 0 0 0 0 0 0 0 22 36 89 63 77 126 -+66 80 129 66 80 129 66 80 128 33 41 67 0 0 0 0 0 0 -+118 119 119 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 230 230 230 141 141 145 255 255 255 254 254 254 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 154 154 154 -+5 5 5 0 0 0 6 8 19 56 69 119 60 75 125 60 75 125 -+60 75 125 33 41 67 0 0 0 0 0 0 66 66 66 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 96 96 96 0 0 0 0 0 0 0 0 0 -+31 31 31 243 243 243 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 177 177 177 230 230 230 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 254 254 254 230 230 230 44 44 44 -+0 0 0 0 0 0 0 0 0 96 96 96 254 254 254 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+248 248 248 96 96 96 0 0 0 0 0 0 17 26 56 40 57 112 -+51 66 119 44 57 102 0 0 0 0 0 0 66 66 66 248 248 248 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+248 248 248 209 209 209 243 243 243 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 254 254 254 255 255 255 177 177 177 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 96 96 96 248 248 248 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 132 132 134 0 0 0 -+0 0 0 17 26 56 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 40 56 111 -+40 56 111 40 56 111 40 56 111 38 54 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 34 50 107 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 23 40 99 52 67 118 72 85 132 73 86 133 72 85 132 -+73 86 133 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 73 86 134 74 87 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 74 87 133 75 88 134 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 88 135 76 89 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 31 35 49 0 0 0 0 0 0 177 177 177 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 209 209 209 0 0 0 0 0 0 -+15 19 34 82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 -+82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 -+82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 12 14 18 -+0 0 0 0 0 0 209 209 209 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 154 154 154 0 0 0 0 0 0 33 41 67 78 91 137 -+76 89 135 17 24 45 0 0 0 5 5 5 154 154 154 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 -+255 255 255 255 255 255 254 254 254 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 118 119 119 0 1 1 0 0 0 -+6 8 19 22 36 89 25 42 101 25 42 101 25 42 101 25 42 101 -+22 39 98 2 3 5 0 0 0 0 0 1 118 119 119 255 255 255 -+255 255 255 254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 254 254 254 254 254 254 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 255 255 255 -+243 243 243 66 66 66 0 0 0 0 0 0 6 8 19 59 74 124 -+66 80 129 66 80 129 66 80 129 33 41 67 0 0 0 0 0 0 -+118 119 119 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 248 248 248 255 255 255 254 254 254 254 254 254 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 230 230 230 -+31 31 31 0 0 0 2 3 5 39 49 83 60 75 125 60 75 125 -+60 75 125 42 55 96 6 7 9 0 0 0 31 31 31 243 243 243 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 154 154 154 0 0 0 0 0 0 0 0 0 -+80 80 80 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+254 254 254 255 255 255 96 96 96 146 146 148 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 248 248 248 96 96 96 -+0 0 0 0 0 0 0 0 0 132 132 134 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+230 230 230 44 44 44 0 0 0 0 0 0 22 36 89 40 57 112 -+51 66 119 44 57 102 0 0 0 0 0 0 66 66 66 248 248 248 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+254 254 254 251 251 251 255 255 255 254 254 254 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 254 254 254 255 255 255 31 31 31 0 0 0 -+0 0 0 6 8 19 0 0 0 0 0 0 96 96 96 248 248 248 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 132 132 134 0 0 0 -+0 0 0 17 26 56 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 40 56 111 -+40 56 111 40 56 111 40 56 111 38 54 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 34 50 107 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 23 40 99 53 67 120 73 86 133 73 86 133 72 85 132 -+73 86 133 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 73 86 134 74 87 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 74 87 133 75 88 134 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 88 135 76 89 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 15 19 34 0 0 0 0 0 0 230 230 230 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 154 154 154 0 0 0 0 0 0 -+33 41 67 82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 -+82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 -+82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 31 35 49 -+0 0 0 0 0 0 177 177 177 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 209 209 209 0 0 0 0 0 0 31 35 49 77 90 136 -+76 89 135 17 24 45 0 0 0 5 5 5 154 154 154 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 254 254 254 255 255 255 230 230 230 20 20 21 0 0 0 -+0 1 1 17 26 56 25 42 101 25 42 101 25 42 101 25 42 101 -+15 19 34 0 0 0 0 0 0 55 55 55 230 230 230 255 255 255 -+254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+254 254 254 254 254 254 255 255 255 255 255 255 230 230 230 209 209 209 -+209 209 209 230 230 230 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 209 209 209 20 20 21 0 0 0 0 1 1 39 49 83 -+66 80 129 66 80 129 66 80 129 33 41 67 0 0 0 0 0 0 -+118 119 119 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 254 254 254 255 255 255 255 255 255 254 254 254 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+80 80 80 0 0 0 0 0 0 31 35 49 60 75 125 60 75 125 -+60 75 125 49 62 109 6 8 19 0 0 0 20 20 21 209 209 209 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 209 209 209 0 0 0 0 0 0 0 0 0 -+154 154 154 255 255 255 254 254 254 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 251 251 251 55 55 55 55 55 55 255 255 255 254 254 254 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 154 154 154 -+0 0 0 0 0 0 6 7 9 154 154 154 255 255 255 254 254 254 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 -+230 230 230 0 0 0 0 0 0 1 2 4 25 42 101 40 57 112 -+51 66 119 44 57 102 0 0 0 0 0 0 66 66 66 248 248 248 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 254 254 254 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 177 177 177 0 0 0 0 0 0 -+6 7 9 17 26 56 0 0 0 0 0 0 96 96 96 248 248 248 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 132 132 134 0 0 0 -+0 0 0 17 26 56 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 40 56 111 -+40 56 111 40 56 111 40 56 111 38 54 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 34 50 107 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 23 40 99 54 69 120 73 86 133 73 86 133 72 85 132 -+73 86 133 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 73 86 134 74 87 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 74 87 133 75 88 134 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 88 135 76 89 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 77 90 136 78 91 137 78 91 137 -+78 91 137 12 14 18 0 0 0 0 0 0 230 230 230 254 254 254 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 118 119 119 0 0 0 0 0 0 -+42 55 96 82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 -+82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 -+82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 39 49 83 -+0 0 0 0 0 0 146 146 148 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 230 230 230 0 0 0 0 0 0 15 19 34 77 90 136 -+76 89 135 17 24 45 0 0 0 5 5 5 154 154 154 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 254 254 254 255 255 255 118 119 119 0 0 1 -+0 0 0 15 19 34 24 40 99 25 42 101 25 42 101 22 36 89 -+2 3 5 0 0 0 6 7 9 177 177 177 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 251 251 251 154 154 154 31 31 31 0 0 0 0 0 0 -+0 0 0 0 0 0 31 31 31 154 154 154 248 248 248 255 255 255 -+254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+254 254 254 255 255 255 96 96 96 0 0 0 0 0 0 15 19 34 -+59 73 120 66 80 129 66 80 129 33 41 67 0 0 0 0 0 0 -+118 119 119 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+154 154 154 0 1 1 0 0 0 17 24 45 58 72 120 60 75 125 -+60 75 125 60 75 125 12 14 18 0 0 0 6 7 9 154 154 154 -+255 255 255 254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 254 254 254 230 230 230 12 14 18 0 0 0 0 0 0 -+230 230 230 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 209 209 209 31 31 31 0 0 0 248 248 248 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 209 209 209 -+20 20 21 0 0 0 20 20 21 209 209 209 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+177 177 177 0 0 0 0 0 0 6 8 19 25 42 101 40 57 112 -+51 66 119 44 57 102 0 0 0 0 0 0 66 66 66 248 248 248 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 55 55 55 0 0 0 0 0 0 -+17 26 56 17 26 56 0 0 0 0 0 0 96 96 96 248 248 248 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 132 132 134 0 0 0 -+0 0 0 17 26 56 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 40 56 111 -+40 56 111 40 56 111 40 56 111 38 54 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 34 50 107 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 23 40 99 54 69 120 73 86 133 73 86 133 72 85 132 -+73 86 133 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 73 86 134 74 87 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 74 87 133 75 88 134 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 88 135 76 89 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 77 90 136 78 91 137 78 91 137 -+78 91 137 6 7 9 0 0 0 12 14 18 243 243 243 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 96 96 96 0 0 0 0 0 0 -+67 77 99 82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 -+82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 -+82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 39 49 83 -+0 0 0 0 0 0 118 119 119 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 243 243 243 0 0 0 0 0 0 20 20 21 77 90 136 -+76 89 135 17 24 45 0 0 0 5 5 5 154 154 154 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 254 254 254 254 254 254 255 255 255 -+255 255 255 230 230 230 209 209 209 230 230 230 243 243 243 255 255 255 -+255 255 255 254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 230 230 230 0 1 1 -+0 0 0 1 2 4 22 36 89 25 42 101 25 42 101 17 24 45 -+0 0 0 0 0 0 66 66 66 251 251 251 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 255 255 255 -+230 230 230 80 80 80 0 0 1 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 1 0 0 1 80 80 80 230 230 230 -+255 255 255 254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+254 254 254 255 255 255 230 230 230 6 7 9 0 0 0 0 0 0 -+49 61 101 66 80 129 66 80 129 33 41 67 0 0 0 0 0 0 -+118 119 119 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+209 209 209 0 1 1 0 0 0 12 14 18 55 67 113 60 75 125 -+60 75 125 60 75 125 17 24 45 0 0 0 0 0 0 118 119 119 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 230 230 230 55 55 55 0 0 0 31 31 31 -+255 255 255 254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 154 154 154 5 5 5 0 0 0 177 177 177 255 255 255 -+254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 243 243 243 -+55 55 55 0 0 0 31 31 31 243 243 243 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+118 119 119 0 0 0 0 0 0 17 26 56 25 42 101 40 57 112 -+51 66 119 44 57 102 0 0 0 0 0 0 66 66 66 248 248 248 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 -+254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 209 209 209 5 5 5 0 0 0 2 3 5 -+22 36 89 17 26 56 0 0 0 0 0 0 93 98 116 254 254 254 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 132 132 134 0 0 0 -+0 0 0 17 26 56 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 40 56 111 -+40 56 111 40 56 111 40 56 111 38 54 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 34 50 107 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 23 40 99 54 69 120 73 86 133 73 86 133 72 85 132 -+73 86 133 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 73 86 134 74 87 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 74 87 133 75 88 134 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 88 135 76 89 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 2 3 5 0 0 0 20 20 21 243 243 243 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 80 80 80 0 0 0 0 0 0 -+59 73 120 82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 -+82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 -+82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 49 61 101 -+0 0 0 0 0 0 118 119 119 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+254 254 254 243 243 243 0 0 0 0 0 0 12 14 18 77 90 136 -+76 89 135 17 24 45 0 0 0 5 5 5 154 154 154 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 254 254 254 254 254 254 255 255 255 209 209 209 -+96 96 96 55 55 55 44 44 44 44 44 44 80 80 80 154 154 154 -+255 255 255 254 254 254 254 254 254 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 254 254 254 255 255 255 80 80 80 -+0 0 0 0 0 0 18 31 73 25 42 101 22 36 89 6 8 19 -+0 0 0 0 1 1 177 177 177 255 255 255 254 254 254 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 254 254 254 -+66 66 66 0 0 1 0 0 0 0 0 0 12 14 18 15 19 34 -+15 19 34 12 14 18 0 0 0 0 0 0 0 0 1 80 80 80 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 254 254 254 255 255 255 96 96 96 0 0 0 0 0 0 -+33 41 67 66 80 129 66 80 129 33 41 67 0 0 0 0 0 0 -+118 119 119 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 -+255 255 255 255 255 255 230 230 230 177 177 177 177 177 177 209 209 209 -+248 248 248 255 255 255 255 255 255 254 254 254 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+254 254 254 0 1 1 0 0 0 6 8 19 49 62 109 60 75 125 -+60 75 125 60 75 125 33 41 67 0 1 1 0 0 0 80 80 80 -+243 243 243 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 243 243 243 96 96 96 0 0 0 132 132 134 -+255 255 255 254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+251 251 251 118 119 119 0 0 0 0 0 0 80 80 80 255 255 255 -+254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+96 96 96 0 0 0 55 55 55 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 255 255 255 -+55 55 55 0 0 0 0 0 0 22 36 89 25 42 101 40 57 112 -+51 66 119 44 57 102 0 0 0 0 0 0 66 66 66 248 248 248 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 255 255 255 -+255 255 255 209 209 209 154 154 154 146 146 148 177 177 177 209 209 209 -+255 255 255 255 255 255 96 96 96 0 0 0 0 0 0 15 19 34 -+25 42 101 17 26 56 0 0 0 0 0 0 80 80 80 177 177 177 -+177 177 177 177 177 177 177 177 177 177 177 177 230 230 230 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 251 251 251 177 177 177 177 177 177 177 177 177 177 177 177 -+177 177 177 177 177 177 177 177 177 177 177 177 96 96 96 0 0 0 -+0 0 0 17 26 56 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 40 56 111 -+40 56 111 40 56 111 40 56 111 38 54 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 34 50 107 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 23 40 99 53 67 120 72 85 132 73 86 133 72 85 132 -+73 86 133 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 73 86 134 74 87 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 74 87 133 75 88 134 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 88 135 76 89 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 0 1 1 0 0 0 31 31 31 243 243 243 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 66 66 66 0 0 0 0 0 0 -+67 81 125 82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 -+82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 -+82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 49 61 101 -+0 0 0 0 0 0 118 119 119 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 243 243 243 0 0 0 0 0 0 12 14 18 77 90 136 -+76 89 135 17 24 45 0 0 0 5 5 5 154 154 154 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 254 254 254 255 255 255 137 138 138 12 14 18 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 3 5 -+96 96 96 255 255 255 254 254 254 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 254 254 254 255 255 255 177 177 177 -+0 0 0 0 0 0 15 19 34 25 42 101 18 31 73 0 1 1 -+0 0 0 20 20 21 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 254 254 254 255 255 255 137 138 138 -+0 0 1 0 0 0 0 0 0 39 49 83 62 76 125 63 77 126 -+63 77 126 59 73 120 39 49 83 0 0 1 0 0 0 0 1 1 -+154 154 154 255 255 255 254 254 254 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 254 254 254 255 255 255 230 230 230 0 0 0 0 0 0 -+6 7 9 66 80 129 66 80 129 33 41 67 0 0 0 0 0 0 -+118 119 119 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 255 255 255 -+248 248 248 96 96 96 20 20 21 12 14 18 12 14 18 12 14 18 -+31 31 31 154 154 154 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 12 14 18 0 0 0 2 3 5 49 61 101 60 75 125 -+60 75 125 60 75 125 48 60 105 0 1 1 0 0 0 44 44 44 -+230 230 230 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 118 119 119 0 0 0 209 209 209 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+243 243 243 66 66 66 0 0 0 0 0 0 31 31 31 248 248 248 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 255 255 255 -+154 154 154 1 2 4 96 96 96 255 255 255 254 254 254 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 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 1 2 4 22 39 98 25 42 101 40 57 112 -+51 66 119 44 57 102 0 0 0 0 0 0 66 66 66 248 248 248 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 248 248 248 -+93 98 116 20 20 21 6 7 9 5 5 5 6 7 9 20 20 21 -+55 55 55 118 119 119 31 31 31 0 0 0 1 2 4 17 26 56 -+25 42 101 17 26 56 0 0 0 0 0 0 5 5 5 12 14 18 -+12 14 18 12 14 18 12 14 18 6 7 9 154 154 154 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 248 248 248 5 5 5 12 14 18 12 14 18 12 14 18 -+12 14 18 12 14 18 12 14 18 12 14 18 6 7 9 0 0 0 -+0 0 0 17 26 56 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 40 56 111 -+40 56 111 40 56 111 40 56 111 38 54 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 34 50 107 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 23 40 99 51 66 119 72 85 132 73 86 133 72 85 132 -+73 86 133 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 73 86 134 74 87 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 74 87 133 75 88 134 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 88 135 76 89 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 0 0 1 0 0 0 31 31 31 243 243 243 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 66 66 66 0 0 0 0 0 0 -+67 81 125 82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 -+82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 -+82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 49 61 101 -+0 0 0 0 0 0 118 119 119 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+254 254 254 243 243 243 0 0 0 0 0 0 12 14 18 78 91 137 -+76 89 135 17 24 45 0 0 0 5 5 5 154 154 154 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 154 154 154 6 7 9 0 0 0 -+0 0 1 1 2 4 1 2 4 1 2 4 0 1 1 0 0 0 -+0 0 1 93 98 116 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 248 248 248 -+0 0 0 0 0 0 2 3 5 25 42 101 17 26 56 0 0 0 -+0 0 0 118 119 119 255 255 255 254 254 254 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 5 5 5 -+0 0 0 0 0 0 39 49 83 68 81 130 68 82 130 68 82 130 -+68 82 130 68 82 130 67 80 128 31 35 49 0 0 0 0 0 0 -+55 55 55 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 254 254 254 254 254 254 44 44 44 0 0 1 -+0 0 0 55 67 113 66 80 128 33 41 67 0 0 0 0 0 0 -+118 119 119 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 230 230 230 -+44 44 44 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 177 177 177 254 254 254 254 254 254 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 31 31 31 0 0 0 0 0 0 49 61 101 60 75 125 -+60 75 125 60 75 125 59 74 124 2 3 5 0 0 0 5 5 5 -+209 209 209 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 154 154 154 31 31 31 251 251 251 -+254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+230 230 230 6 7 9 0 0 0 0 0 0 20 20 21 209 209 209 -+255 255 255 254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+230 230 230 5 5 5 154 154 154 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 209 209 209 -+0 0 0 0 0 0 6 8 19 23 40 99 25 42 101 40 57 112 -+51 66 119 44 57 102 0 0 0 0 0 0 66 66 66 248 248 248 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 248 248 248 96 96 96 -+0 0 0 0 0 0 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 9 25 42 101 -+25 42 101 17 26 56 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 146 146 148 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 248 248 248 0 0 0 0 0 0 0 0 0 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 26 56 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 40 56 111 -+40 56 111 40 56 111 40 56 111 38 54 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 34 50 107 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 23 40 99 49 64 117 72 85 132 73 86 133 72 85 132 -+73 86 133 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 73 86 134 74 87 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 74 87 133 75 88 134 76 89 135 75 88 134 -+76 89 135 76 89 135 76 89 135 76 89 135 76 88 135 76 89 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 1 2 4 0 0 0 20 20 21 243 243 243 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 66 66 66 0 0 0 0 0 0 -+59 73 120 82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 -+82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 -+82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 42 55 96 -+0 0 0 0 0 0 118 119 119 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 243 243 243 0 0 0 0 0 0 12 14 18 78 91 137 -+76 89 135 17 24 45 0 0 0 5 5 5 154 154 154 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 230 230 230 44 44 44 0 0 1 0 0 0 -+12 14 18 49 61 101 67 81 125 59 73 120 31 35 49 0 1 1 -+0 0 0 0 0 0 209 209 209 255 255 255 254 254 254 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 251 251 251 -+55 55 55 0 0 0 0 0 0 22 36 89 15 19 34 0 0 0 -+0 0 0 209 209 209 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 177 177 177 0 0 0 -+0 0 0 0 1 1 15 19 34 15 19 34 15 19 34 15 19 34 -+15 19 34 15 19 34 17 24 45 12 14 18 0 1 1 0 0 0 -+31 31 31 209 209 209 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 254 254 254 118 119 119 0 0 0 -+0 0 0 33 41 67 66 80 128 33 41 67 0 0 0 0 0 0 -+118 119 119 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 254 254 254 248 248 248 96 96 96 -+0 0 1 0 0 0 1 2 4 12 14 18 6 8 19 6 8 19 -+0 0 0 0 0 0 20 20 21 248 248 248 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 55 55 55 0 0 0 0 0 0 49 61 101 60 75 125 -+60 75 125 60 75 125 59 74 124 15 19 34 0 0 0 0 0 0 -+177 177 177 254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 177 177 177 118 119 119 251 251 251 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+177 177 177 0 0 0 0 0 0 0 0 0 2 3 5 137 138 138 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 -+255 255 255 44 44 44 209 209 209 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 132 132 134 -+0 0 0 0 0 0 17 24 45 24 41 99 25 42 101 40 57 112 -+51 66 119 44 57 102 0 0 0 0 0 0 66 66 66 248 248 248 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 254 254 254 255 255 255 177 177 177 0 0 0 -+0 0 0 0 0 1 6 8 19 6 8 19 6 8 19 2 3 5 -+0 0 0 0 0 0 0 0 0 0 0 0 17 26 56 25 42 101 -+25 42 101 18 31 73 6 8 19 6 8 19 6 8 19 6 8 19 -+6 8 19 2 3 5 0 0 0 0 0 0 146 146 148 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 248 248 248 0 0 0 0 0 0 1 2 4 6 8 19 -+6 8 19 6 8 19 6 8 19 6 8 19 6 8 19 6 8 19 -+6 8 19 18 31 73 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 43 102 40 56 111 -+40 56 111 40 56 111 40 56 111 38 54 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 34 50 107 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 23 40 99 47 63 116 72 85 132 73 86 133 72 85 132 -+73 86 133 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 73 86 134 74 87 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 74 87 133 74 87 133 75 88 134 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 88 135 76 89 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 78 91 137 77 90 136 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 6 7 9 0 0 0 12 14 18 243 243 243 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 80 80 80 0 0 0 0 0 0 -+67 77 99 82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 -+82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 -+82 95 139 82 95 139 82 95 139 82 95 139 80 93 136 39 49 83 -+0 0 0 0 0 0 137 138 138 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 230 230 230 0 0 0 0 0 0 15 19 34 78 91 137 -+76 89 135 17 24 45 0 0 0 5 5 5 154 154 154 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 254 254 254 177 177 177 0 0 0 0 0 0 6 7 9 -+67 81 125 76 89 135 76 89 135 75 88 134 73 86 130 17 24 45 -+0 0 0 0 0 0 80 80 80 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 251 251 251 -+118 119 119 0 0 0 0 0 0 18 31 73 6 7 9 0 0 0 -+12 14 18 255 255 255 254 254 254 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 254 254 254 255 255 255 96 96 96 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 -+6 7 9 177 177 177 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 254 254 254 177 177 177 0 0 0 -+0 0 0 17 24 45 66 80 128 33 41 67 0 0 0 0 0 0 -+118 119 119 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 254 254 254 209 209 209 12 14 18 -+0 0 1 0 0 0 33 41 67 55 67 113 29 46 103 22 36 89 -+6 8 19 0 0 0 0 0 0 177 177 177 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 55 55 55 0 0 0 0 0 0 49 61 101 60 75 125 -+60 75 125 60 75 125 59 74 124 33 41 67 0 0 0 0 0 0 -+118 119 119 254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 209 209 209 209 209 209 254 254 254 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 255 255 255 -+96 96 96 0 0 0 0 0 0 0 0 0 0 0 0 96 96 96 -+251 251 251 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 -+255 255 255 141 141 145 254 254 254 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 254 254 254 255 255 255 66 66 66 -+0 0 0 0 0 0 18 31 73 24 41 100 25 42 101 40 57 112 -+51 66 119 44 57 102 0 0 0 0 0 0 66 66 66 248 248 248 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 20 20 21 0 0 0 -+0 0 0 17 24 45 25 42 100 25 42 101 22 39 98 18 31 73 -+17 24 45 6 8 19 0 0 0 1 2 4 24 41 99 25 42 101 -+25 42 101 24 41 99 22 39 98 22 39 98 22 39 98 22 39 98 -+22 36 89 15 19 34 0 0 0 0 0 0 146 146 148 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 248 248 248 0 0 0 0 0 0 6 8 19 22 36 89 -+22 39 98 22 39 98 22 39 98 22 39 98 22 39 98 22 39 98 -+22 39 98 24 41 99 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 43 102 40 56 111 -+40 56 111 40 56 111 40 56 111 38 54 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 33 49 106 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 23 40 100 44 60 114 71 85 132 73 86 133 72 85 132 -+73 86 133 73 86 133 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 73 86 134 74 87 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 74 87 133 75 88 134 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 88 135 76 89 135 -+76 90 135 76 89 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 76 89 135 77 90 136 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 12 14 18 0 0 0 0 0 0 230 230 230 254 254 254 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 118 119 119 0 0 0 0 0 0 -+49 61 101 82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 -+82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 -+82 95 139 82 95 139 82 95 139 80 93 136 82 95 139 33 41 67 -+0 0 0 0 0 0 154 154 154 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 209 209 209 0 0 0 0 0 0 17 24 45 78 91 137 -+76 89 135 17 24 45 0 0 0 5 5 5 154 154 154 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 251 251 251 96 96 96 0 0 0 0 0 0 33 41 67 -+76 89 135 76 89 135 76 89 135 76 89 135 74 87 133 42 55 96 -+5 5 5 0 0 0 44 44 44 230 230 230 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 -+154 154 154 0 0 0 0 0 0 17 24 45 0 0 0 0 0 0 -+66 66 66 255 255 255 254 254 254 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 44 44 44 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 137 138 138 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 209 209 209 0 0 0 -+0 0 0 6 7 9 66 80 128 33 41 67 0 0 0 0 0 0 -+118 119 119 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 154 154 154 0 0 0 -+0 0 0 15 19 34 63 77 126 59 74 124 29 47 104 24 41 100 -+17 26 56 0 0 0 0 0 0 118 119 119 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 55 55 55 0 0 0 0 0 0 49 61 101 60 75 125 -+60 75 125 60 75 125 59 74 124 48 60 105 0 0 0 0 0 0 -+55 55 55 251 251 251 254 254 254 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 248 248 248 251 251 251 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 255 255 255 -+6 7 9 0 0 0 0 0 0 0 0 0 0 0 0 44 44 44 -+230 230 230 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 243 243 243 255 255 255 254 254 254 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 12 14 18 -+0 0 0 2 3 5 18 31 73 24 41 100 25 42 101 42 57 112 -+51 66 119 44 57 102 0 0 0 0 0 0 66 66 66 248 248 248 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 177 177 177 0 0 0 0 0 0 -+6 8 19 24 40 99 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 22 36 89 18 31 73 17 26 56 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 99 17 24 45 0 0 0 0 0 0 146 146 148 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 248 248 248 0 0 0 0 0 0 6 8 19 24 40 99 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 43 102 40 56 111 -+40 56 111 40 56 111 40 56 111 38 54 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 33 49 106 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 23 40 100 40 56 111 71 84 131 73 86 133 73 86 133 -+72 85 132 73 86 133 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 73 86 134 74 87 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 74 87 133 75 88 134 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 88 135 76 89 135 -+76 89 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 76 89 135 77 90 136 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 77 90 136 78 91 137 -+78 91 137 15 19 34 0 0 0 0 0 0 230 230 230 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 137 138 138 0 0 0 0 0 0 -+39 49 83 82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 -+82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 -+82 95 139 82 95 139 80 93 136 82 95 139 82 95 139 17 24 45 -+0 0 0 0 0 0 177 177 177 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 177 177 177 0 0 0 0 0 0 31 35 49 78 91 137 -+76 89 135 17 24 45 0 0 0 5 5 5 154 154 154 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 248 248 248 44 44 44 0 0 0 0 0 0 59 73 120 -+76 89 135 76 89 135 76 89 135 76 89 135 74 87 133 67 81 125 -+6 8 19 0 0 1 20 20 21 209 209 209 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+177 177 177 0 0 0 0 0 0 6 8 19 0 0 0 0 0 0 -+118 119 119 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 230 230 230 209 209 209 -+209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 -+209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 -+209 209 209 230 230 230 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 209 209 209 31 31 31 -+0 0 1 0 1 1 66 80 128 33 41 67 0 0 0 0 0 0 -+118 119 119 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 96 96 96 0 0 0 -+0 0 0 33 41 67 63 77 126 57 72 122 30 46 104 24 41 100 -+18 31 73 0 0 0 0 0 0 80 80 80 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 55 55 55 0 0 0 0 0 0 49 61 101 60 75 125 -+60 75 125 60 75 125 59 74 124 59 74 124 0 1 1 0 0 0 -+0 0 0 248 248 248 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 254 254 254 255 255 255 255 255 255 254 254 254 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 209 209 209 -+0 0 0 0 0 0 12 14 18 1 2 4 0 0 0 5 5 5 -+209 209 209 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+254 254 254 255 255 255 254 254 254 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 209 209 209 5 5 5 -+0 0 0 6 8 19 22 36 89 24 41 100 25 43 102 42 58 112 -+51 66 119 44 57 102 0 0 0 0 0 0 66 66 66 248 248 248 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 80 80 80 0 0 0 0 0 0 -+17 26 56 25 42 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 99 17 24 45 0 0 0 0 0 0 146 146 148 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 248 248 248 0 0 0 0 0 0 6 8 19 24 40 99 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 26 43 102 40 56 111 -+40 56 111 40 56 111 40 56 111 38 54 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 33 49 106 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 36 52 108 70 84 131 73 86 133 73 86 133 -+72 85 132 73 86 133 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 73 86 134 74 87 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 74 87 133 75 88 134 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 88 135 -+76 89 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 77 90 136 76 90 135 77 90 136 77 90 136 -+77 90 136 77 90 136 76 89 135 77 90 136 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 77 90 136 78 91 137 -+78 91 137 31 35 49 0 0 0 0 0 0 209 209 209 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 177 177 177 0 0 0 0 0 0 -+31 35 49 82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 -+82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 -+82 95 139 80 93 136 82 95 139 82 95 139 82 95 139 6 8 19 -+0 0 0 0 0 0 230 230 230 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 154 154 154 0 0 0 0 0 0 33 41 67 78 91 137 -+76 89 135 17 24 45 0 0 0 5 5 5 154 154 154 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 248 248 248 12 14 18 0 0 0 0 0 0 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 74 87 133 75 88 134 -+12 14 18 0 0 0 12 14 18 177 177 177 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+209 209 209 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+141 141 145 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 254 254 254 254 254 254 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 254 254 254 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 230 230 230 44 44 44 -+0 0 0 0 1 1 59 73 120 33 41 67 0 0 0 0 0 0 -+118 119 119 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 55 55 55 0 0 1 -+0 0 0 49 62 109 63 77 126 57 72 122 29 46 104 24 41 100 -+18 31 73 0 0 0 0 0 0 66 66 66 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 55 55 55 0 0 0 0 0 0 49 61 101 60 75 125 -+60 75 125 60 75 125 59 74 124 59 74 124 15 19 34 0 0 0 -+0 0 0 209 209 209 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 254 254 254 255 255 255 118 119 119 -+0 0 0 0 0 0 33 41 67 17 24 45 0 0 0 0 0 0 -+146 146 148 254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 254 254 254 255 255 255 146 146 148 2 3 5 -+0 0 0 15 19 34 24 41 99 24 41 100 26 43 102 43 58 114 -+51 66 119 44 57 102 0 0 0 0 0 0 66 66 66 248 248 248 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 20 20 21 0 0 0 0 0 0 -+18 31 73 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 99 17 24 45 0 0 0 0 0 0 146 146 148 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 248 248 248 0 0 0 0 0 0 6 8 19 24 40 99 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 26 44 102 40 56 111 -+40 56 111 40 56 111 40 56 111 38 54 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 32 48 107 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 32 48 107 70 84 131 73 86 133 73 86 133 -+72 85 132 73 86 133 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 73 86 134 73 86 134 74 87 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 74 87 133 75 88 134 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 88 135 -+76 89 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 76 89 135 77 90 136 78 91 137 77 90 136 -+78 91 137 78 91 137 78 91 137 78 91 137 77 90 136 78 91 137 -+78 91 137 33 41 67 0 0 0 0 0 0 154 154 154 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 230 230 230 0 0 0 0 0 0 -+6 7 9 80 93 136 82 95 139 82 95 139 82 95 139 82 95 139 -+82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 -+80 93 136 80 93 136 82 95 139 82 95 139 76 90 135 0 0 0 -+0 0 0 20 20 21 230 230 230 254 254 254 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 118 119 119 0 0 1 0 0 0 42 55 96 78 91 137 -+76 89 135 17 24 45 0 0 0 5 5 5 154 154 154 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 243 243 243 0 0 0 0 0 0 6 7 9 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 74 87 133 75 88 134 -+20 20 21 0 0 0 5 5 5 177 177 177 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+209 209 209 6 7 9 0 0 0 0 0 0 0 0 0 0 0 0 -+154 154 154 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 230 230 230 66 66 66 -+0 0 0 0 1 1 49 61 101 33 41 67 0 0 0 0 0 0 -+118 119 119 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 31 31 31 0 0 0 -+0 0 0 62 76 125 63 77 126 56 71 121 29 45 103 24 41 100 -+22 36 89 0 0 0 0 0 0 66 66 66 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 55 55 55 0 0 0 0 0 0 49 61 101 60 75 125 -+60 75 125 60 75 125 59 74 124 59 74 124 33 41 67 0 0 0 -+0 0 0 118 119 119 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 31 31 31 -+0 0 0 0 0 0 39 49 83 39 49 83 0 0 0 0 0 0 -+80 80 80 251 251 251 254 254 254 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 96 96 96 0 0 0 -+0 0 0 17 24 45 25 42 101 24 41 100 26 43 102 43 59 113 -+51 66 119 44 57 102 0 0 0 0 0 0 66 66 66 248 248 248 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 230 230 230 6 7 9 0 0 0 6 7 9 -+22 36 89 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 99 17 24 45 0 0 0 0 0 0 146 146 148 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 248 248 248 0 0 0 0 0 0 6 8 19 24 40 99 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 26 43 102 40 56 111 -+40 56 111 40 56 111 40 56 111 38 54 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 32 50 106 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 27 44 102 69 83 130 72 85 132 73 86 133 -+72 85 132 73 86 133 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 73 86 134 74 87 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 74 87 133 75 88 134 75 88 134 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 88 135 -+76 89 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 76 89 135 77 90 136 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 77 90 136 -+78 91 137 49 61 101 0 0 0 0 0 1 96 96 96 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 254 254 254 243 243 243 31 31 31 0 0 0 -+0 0 0 67 81 125 82 95 139 82 95 139 80 93 136 80 93 136 -+80 93 136 80 93 136 80 93 136 80 93 136 82 95 139 82 95 139 -+82 95 139 82 95 139 82 95 139 82 95 139 49 61 101 0 0 0 -+0 0 1 66 66 66 243 243 243 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 -+255 255 255 66 66 66 0 0 1 0 0 0 55 67 113 78 91 137 -+76 89 135 17 24 45 0 0 0 5 5 5 154 154 154 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 243 243 243 0 0 0 0 0 0 12 14 18 76 89 135 -+76 89 135 76 89 135 75 88 134 76 89 135 74 87 133 75 88 134 -+15 19 34 0 0 0 2 3 5 154 154 154 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+209 209 209 12 14 18 0 0 0 0 0 0 0 0 0 0 0 0 -+177 177 177 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 243 243 243 80 80 80 -+0 0 0 0 0 1 49 61 101 33 41 67 0 0 0 0 0 0 -+118 119 119 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 12 14 18 0 0 0 -+0 0 0 64 78 127 63 77 126 54 69 120 28 45 103 24 41 100 -+22 36 89 0 0 0 0 0 0 66 66 66 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 55 55 55 0 0 0 0 0 0 49 61 101 60 75 125 -+60 75 125 60 75 125 59 74 124 59 74 124 42 55 96 0 0 0 -+0 0 0 55 55 55 255 255 255 254 254 254 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 230 230 230 5 5 5 -+0 0 0 6 7 9 48 60 105 55 69 121 0 0 0 0 0 0 -+2 3 5 248 248 248 254 254 254 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 248 248 248 55 55 55 0 0 0 -+1 2 4 17 26 56 25 42 101 24 41 100 27 43 102 44 60 114 -+51 66 119 44 57 102 0 0 0 0 0 0 66 66 66 248 248 248 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 177 177 177 6 7 9 0 0 0 6 8 19 -+22 36 89 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 99 17 24 45 0 0 0 0 0 0 146 146 148 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 248 248 248 0 0 0 0 0 0 6 8 19 24 40 99 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 27 44 103 40 56 111 -+40 56 111 40 56 111 40 56 111 38 54 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 32 50 106 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 23 40 99 68 81 130 73 86 133 73 86 133 -+72 85 132 73 86 133 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 73 86 134 74 87 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 74 87 133 75 88 134 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 88 135 -+76 89 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 76 89 135 77 90 136 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 77 90 136 -+78 91 137 67 81 125 0 0 0 0 0 0 44 44 44 255 255 255 -+254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 248 248 248 96 96 96 0 0 1 -+0 0 0 31 35 49 82 95 139 82 95 139 82 95 139 82 95 139 -+82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 -+82 95 139 82 95 139 82 95 139 82 95 139 17 24 45 0 0 0 -+0 0 0 132 132 134 251 251 251 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 5 5 5 0 0 0 0 1 1 68 81 126 78 91 137 -+76 89 135 17 24 45 0 0 0 5 5 5 154 154 154 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 243 243 243 0 0 0 0 0 0 12 14 18 76 89 135 -+76 89 135 76 89 135 76 89 135 75 88 134 74 87 133 75 88 134 -+15 19 34 0 0 0 5 5 5 177 177 177 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+209 209 209 12 14 18 0 0 0 0 0 0 0 0 0 0 0 0 -+177 177 177 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 243 243 243 80 80 80 -+0 0 0 0 0 1 42 55 96 33 41 67 0 0 0 0 0 0 -+118 119 119 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 6 7 9 0 0 0 -+1 2 4 64 78 127 63 77 126 52 67 118 27 44 102 24 41 100 -+22 36 89 0 0 0 0 0 0 66 66 66 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 55 55 55 0 0 0 0 0 0 49 61 101 60 75 125 -+60 75 125 60 75 125 59 74 124 59 74 124 49 62 109 2 3 5 -+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 146 146 148 1 2 4 -+0 0 0 15 19 34 55 67 113 56 70 122 15 19 34 0 0 0 -+0 0 0 177 177 177 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 209 209 209 31 31 31 0 0 0 -+2 3 5 22 36 89 25 42 101 24 41 100 27 44 102 45 60 114 -+51 66 119 44 57 102 0 0 0 0 0 0 66 66 66 248 248 248 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 154 154 154 5 5 5 0 0 0 15 19 34 -+24 41 99 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 99 17 24 45 0 0 0 0 0 0 146 146 148 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 248 248 248 0 0 0 0 0 0 6 8 19 24 40 99 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 27 44 103 40 56 111 -+40 56 111 40 56 111 40 56 111 38 54 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 32 48 107 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 22 39 98 61 75 125 73 86 133 73 86 133 -+72 85 132 73 86 133 73 86 133 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 73 86 134 74 87 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 74 87 133 75 88 134 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 88 135 -+76 89 135 76 89 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 76 89 135 77 90 136 77 90 136 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 77 90 136 -+78 91 137 73 86 130 6 7 9 0 0 0 0 0 0 251 251 251 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 177 177 177 0 0 0 -+0 0 1 2 3 5 71 84 128 82 95 139 82 95 139 82 95 139 -+82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 -+82 95 139 82 95 139 82 95 139 67 81 125 6 7 9 0 0 1 -+6 7 9 177 177 177 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+209 209 209 0 0 0 0 0 0 12 14 18 71 84 128 78 91 137 -+76 89 135 17 24 45 0 0 0 5 5 5 154 154 154 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 243 243 243 0 0 0 0 0 0 6 7 9 76 89 135 -+76 89 135 76 89 135 76 89 135 74 87 133 75 88 134 75 88 134 -+12 14 18 0 0 0 6 7 9 177 177 177 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+209 209 209 6 7 9 0 0 0 0 0 0 0 0 0 0 0 0 -+154 154 154 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 243 243 243 80 80 80 -+0 0 0 0 0 1 42 55 96 33 41 67 0 0 0 0 0 0 -+118 119 119 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 6 7 9 0 0 0 -+1 2 4 64 78 127 63 77 126 51 66 119 26 43 102 24 41 100 -+22 36 89 0 0 0 0 0 0 66 66 66 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 55 55 55 0 0 0 0 0 0 49 61 101 60 75 125 -+60 75 125 60 75 125 59 74 124 59 74 124 55 67 113 15 19 34 -+0 0 0 0 0 0 209 209 209 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 80 80 80 0 0 0 -+0 0 0 31 35 49 56 70 122 56 70 122 33 41 67 0 0 0 -+0 0 0 96 96 96 255 255 255 254 254 254 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 177 177 177 12 14 18 0 0 0 -+6 7 9 24 41 99 25 42 101 24 41 100 27 44 102 46 61 115 -+51 66 119 44 57 102 0 0 0 0 0 0 66 66 66 248 248 248 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 132 132 134 2 3 5 0 0 0 15 19 34 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 99 17 24 45 0 0 0 0 0 0 146 146 148 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 248 248 248 0 0 0 0 0 0 6 8 19 24 40 99 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 28 45 103 40 56 111 -+40 56 111 40 56 111 40 56 111 38 54 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 31 47 105 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 23 39 99 51 66 119 73 86 133 73 86 133 -+72 85 132 73 86 133 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 73 86 134 74 87 134 74 87 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 74 87 133 75 88 134 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 88 135 76 89 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 76 89 135 77 90 136 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+77 90 136 74 88 133 17 24 45 0 0 0 0 0 1 177 177 177 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 230 230 230 55 55 55 -+0 0 1 0 0 1 31 35 49 77 90 136 82 95 139 82 95 139 -+82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 -+82 95 139 82 95 139 80 93 136 31 35 49 0 0 1 0 0 0 -+55 55 55 243 243 243 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 255 255 255 -+141 141 145 0 0 1 0 0 0 31 35 49 75 88 134 78 91 137 -+76 89 135 17 24 45 0 0 0 5 5 5 154 154 154 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 248 248 248 20 20 21 0 0 0 0 0 0 75 88 134 -+76 89 135 76 89 135 76 89 135 75 88 134 75 88 134 73 86 130 -+6 8 19 0 0 1 20 20 21 177 177 177 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+209 209 209 5 5 5 0 0 0 1 2 4 0 0 0 0 0 0 -+137 138 138 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 254 254 254 254 254 254 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 96 96 96 -+0 0 0 0 0 1 39 49 83 33 41 67 0 0 0 0 0 0 -+118 119 119 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 6 7 9 0 0 0 -+1 2 4 64 78 127 63 77 126 48 63 117 25 42 101 24 41 100 -+22 36 89 0 0 0 0 0 0 66 66 66 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 55 55 55 0 0 0 0 0 0 49 61 101 60 75 125 -+60 75 125 60 75 125 59 74 124 59 74 124 58 72 120 17 24 45 -+0 0 0 0 0 0 132 132 134 255 255 255 254 254 254 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 230 230 230 44 44 44 0 0 0 -+2 3 5 39 49 83 56 70 122 56 70 122 44 57 102 0 0 0 -+0 0 0 20 20 21 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 146 146 148 0 0 0 0 0 0 -+6 8 19 25 42 101 25 42 101 24 41 100 27 44 103 46 61 115 -+51 66 119 44 57 102 0 0 0 0 0 0 66 66 66 248 248 248 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 118 119 119 0 1 1 0 0 0 15 19 34 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 99 17 24 45 0 0 0 0 0 0 146 146 148 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 248 248 248 0 0 0 0 0 0 6 8 19 24 40 99 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 29 46 104 40 56 111 -+40 56 111 40 56 111 40 56 111 38 54 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 31 47 105 24 41 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 23 40 100 42 57 112 74 87 133 73 86 133 -+73 86 133 72 85 132 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 73 86 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 74 87 133 75 88 134 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 88 135 76 89 135 76 89 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 76 89 135 77 90 136 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 77 90 136 39 49 83 0 0 0 0 0 1 80 80 80 -+255 255 255 254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 154 154 154 -+1 2 4 0 0 0 0 1 1 31 35 49 76 90 135 82 95 139 -+82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 82 95 139 -+82 95 139 80 93 136 31 35 49 0 1 1 0 0 0 0 0 0 -+177 177 177 255 255 255 254 254 254 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+55 55 55 0 0 0 0 0 0 39 49 83 78 91 137 78 91 137 -+76 89 135 17 24 45 0 0 0 5 5 5 154 154 154 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 248 248 248 66 66 66 0 0 1 0 0 0 49 61 101 -+76 89 135 75 88 134 76 89 135 75 88 134 75 88 134 55 67 113 -+6 7 9 0 0 0 31 31 31 209 209 209 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+209 209 209 0 0 0 0 0 0 6 8 19 0 0 0 0 0 0 -+96 96 96 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 177 177 177 154 154 154 -+154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 -+154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 -+154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 -+154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 -+154 154 154 154 154 154 154 154 154 154 154 154 154 154 154 55 55 55 -+0 0 0 0 0 1 39 49 83 33 41 67 0 0 0 0 0 0 -+118 119 119 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 6 7 9 0 0 0 -+1 2 4 62 76 125 63 77 126 46 61 115 24 41 101 24 41 100 -+22 36 89 0 0 0 0 0 0 66 66 66 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 55 55 55 0 0 0 0 0 0 49 61 101 60 75 125 -+60 75 125 60 75 125 59 74 124 59 74 124 59 74 124 33 41 67 -+0 0 0 0 0 0 66 66 66 255 255 255 254 254 254 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 177 177 177 20 20 21 0 0 0 -+6 7 9 49 62 109 56 70 122 56 70 122 49 62 109 12 14 18 -+0 0 0 0 0 0 209 209 209 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 248 248 248 93 98 116 0 0 0 0 0 0 -+17 26 56 25 42 101 25 42 101 24 41 100 28 45 103 47 63 116 -+51 66 119 44 57 102 0 0 0 0 0 0 66 66 66 248 248 248 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 96 96 96 0 0 0 0 0 1 17 24 45 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 99 17 24 45 0 0 0 0 0 0 146 146 148 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 248 248 248 0 0 0 0 0 0 6 8 19 24 40 99 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 29 46 104 40 56 111 -+40 56 111 39 55 111 40 56 111 38 54 111 39 55 111 39 55 111 -+39 55 111 38 54 111 39 55 111 29 47 104 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 31 47 105 74 87 134 72 85 132 -+73 86 133 72 85 132 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 73 86 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 74 87 133 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 88 135 76 89 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 76 89 135 -+78 91 137 77 90 136 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 77 90 136 49 61 101 5 5 5 0 0 0 20 20 21 -+230 230 230 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 254 254 254 255 255 255 255 255 255 -+96 96 96 0 0 1 0 0 0 0 0 0 6 7 9 39 49 83 -+74 87 130 82 95 139 82 95 139 82 95 139 82 95 139 73 86 130 -+39 49 83 6 7 9 0 0 0 0 0 0 0 0 1 96 96 96 -+255 255 255 255 255 255 254 254 254 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 230 230 230 -+20 20 21 0 0 0 6 7 9 55 67 113 78 91 137 78 91 137 -+76 89 135 17 24 45 0 0 0 5 5 5 154 154 154 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 254 254 254 137 138 138 0 0 0 0 0 0 15 19 34 -+76 89 135 76 89 135 75 88 134 75 88 134 75 88 134 39 49 83 -+1 2 4 0 0 0 55 55 55 248 248 248 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 -+177 177 177 0 0 0 0 0 0 15 19 34 2 3 5 0 0 0 -+55 55 55 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 55 55 55 2 3 5 -+2 3 5 2 3 5 2 3 5 2 3 5 2 3 5 2 3 5 -+2 3 5 2 3 5 2 3 5 2 3 5 2 3 5 2 3 5 -+2 3 5 2 3 5 2 3 5 2 3 5 2 3 5 2 3 5 -+2 3 5 2 3 5 2 3 5 2 3 5 2 3 5 2 3 5 -+2 3 5 2 3 5 2 3 5 2 3 5 2 3 5 0 1 1 -+0 0 0 0 0 1 39 49 83 33 41 67 0 0 0 0 0 0 -+118 119 119 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 6 7 9 0 0 0 -+1 2 4 63 77 126 63 77 126 44 59 113 24 41 100 24 41 100 -+22 36 89 0 0 0 0 0 0 66 66 66 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 55 55 55 0 0 0 0 0 0 49 61 101 60 75 125 -+60 75 125 60 75 125 59 74 124 59 74 124 59 74 124 39 49 83 -+2 3 5 0 0 0 31 31 31 248 248 248 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 141 141 145 0 0 0 0 0 0 -+12 14 18 56 70 122 56 70 122 56 70 122 55 68 119 17 24 45 -+0 0 0 0 0 0 132 132 134 255 255 255 254 254 254 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 243 243 243 66 66 66 0 0 0 0 0 0 -+18 31 73 25 42 101 25 42 101 24 41 100 28 45 103 48 63 117 -+51 66 119 44 57 102 0 0 0 0 0 0 66 66 66 248 248 248 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 96 96 96 0 0 0 0 0 1 17 24 45 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 99 17 24 45 0 0 0 0 0 0 146 146 148 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 248 248 248 0 0 0 0 0 0 6 8 19 24 40 99 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 31 47 105 40 56 111 -+40 56 111 40 56 111 39 55 111 38 54 111 39 55 111 39 55 111 -+39 55 111 39 55 110 39 55 111 30 46 104 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 23 40 100 72 85 132 73 86 133 -+73 86 133 72 85 132 74 87 134 73 86 133 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 73 86 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 74 87 133 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 88 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 77 90 136 76 90 135 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 76 89 135 -+77 90 136 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 69 82 127 15 19 34 0 0 0 5 5 5 -+146 146 148 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 -+255 255 255 96 96 96 2 3 5 0 0 1 0 0 0 0 0 0 -+0 0 0 5 5 5 12 14 18 12 14 18 2 3 5 0 0 0 -+0 0 0 0 0 0 0 0 1 1 2 4 96 96 96 255 255 255 -+254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 141 141 145 -+5 5 5 0 0 0 15 19 34 73 86 130 78 91 137 78 91 137 -+75 88 134 17 24 45 0 0 0 5 5 5 154 154 154 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 209 209 209 12 14 18 0 0 1 0 0 1 -+33 41 67 73 86 130 74 87 133 73 87 131 59 73 120 20 20 21 -+0 0 0 0 0 0 118 119 119 255 255 255 254 254 254 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 -+137 138 138 0 0 0 0 0 0 17 26 56 6 8 19 0 0 0 -+5 5 5 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 254 254 254 255 255 255 96 96 96 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 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 1 0 0 0 -+0 0 0 0 0 1 39 49 83 33 41 67 0 0 0 0 0 0 -+118 119 119 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 6 7 9 0 0 0 -+1 2 4 63 77 126 62 76 125 42 57 112 24 41 100 25 42 101 -+22 36 89 0 0 0 0 0 0 66 66 66 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 55 55 55 0 0 0 0 0 0 49 61 101 60 75 125 -+59 74 124 60 75 125 59 74 124 59 74 124 59 74 124 48 60 105 -+6 8 19 0 0 0 20 20 21 209 209 209 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 243 243 243 96 96 96 0 0 0 0 0 0 -+33 41 67 56 70 122 56 70 122 56 70 122 55 70 121 33 41 67 -+0 0 0 0 0 0 55 55 55 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 230 230 230 12 14 18 0 0 0 0 0 0 -+25 42 101 25 42 101 25 42 101 24 41 100 29 46 104 49 64 117 -+50 65 118 44 57 102 0 0 0 0 0 0 66 66 66 248 248 248 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 80 80 80 0 0 0 0 1 1 17 26 56 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 99 17 24 45 0 0 0 0 0 0 146 146 148 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 248 248 248 0 0 0 0 0 0 6 8 19 24 40 99 -+25 42 101 25 42 101 24 41 99 22 36 89 22 36 89 15 19 34 -+17 26 56 25 42 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 31 47 105 40 56 111 -+40 56 111 40 56 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 30 46 104 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 23 40 99 61 75 125 73 86 133 -+73 86 133 72 85 132 73 86 133 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 73 86 134 75 88 134 74 87 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 74 87 133 -+76 89 135 75 88 134 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 88 135 76 90 135 76 89 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 78 91 137 77 90 136 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 77 90 136 33 41 67 0 1 1 0 0 0 -+66 66 66 243 243 243 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 -+254 254 254 255 255 255 154 154 154 44 44 44 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 1 0 0 0 44 44 44 154 154 154 255 255 255 254 254 254 -+254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 243 243 243 66 66 66 -+0 0 1 0 1 1 33 41 67 78 91 137 78 91 137 78 91 137 -+76 89 135 17 24 45 0 0 0 5 5 5 154 154 154 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 251 251 251 118 119 119 0 0 0 0 0 0 -+0 0 0 15 19 34 33 41 67 33 41 67 12 14 18 0 0 0 -+0 0 1 20 20 21 230 230 230 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 251 251 251 -+96 96 96 0 0 0 0 0 0 18 31 73 15 19 34 0 0 0 -+0 0 0 209 209 209 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 177 177 177 0 0 0 -+0 0 0 0 0 0 15 19 34 17 24 45 17 24 45 17 24 45 -+17 24 45 17 24 45 17 24 45 17 24 45 5 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 1 -+2 3 5 6 7 9 39 49 83 31 35 49 0 0 0 0 0 0 -+118 119 119 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 6 7 9 0 0 0 -+1 2 4 63 77 126 61 75 125 39 55 110 24 41 100 25 42 101 -+22 36 89 0 0 0 0 0 0 66 66 66 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 55 55 55 0 0 0 0 0 0 49 61 101 60 75 125 -+60 75 125 59 74 124 58 73 123 59 74 124 59 74 124 58 73 123 -+12 14 18 0 0 0 6 7 9 154 154 154 255 255 255 254 254 254 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 254 254 254 230 230 230 31 31 31 0 0 0 0 0 0 -+48 60 105 56 70 122 56 70 122 55 70 121 54 70 120 42 55 96 -+6 7 9 0 0 0 20 20 21 230 230 230 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 209 209 209 0 0 0 0 0 0 6 8 19 -+25 42 101 25 42 101 25 42 101 24 41 100 30 46 104 50 65 118 -+50 65 118 44 57 102 0 0 0 0 0 0 66 66 66 248 248 248 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 80 80 80 0 0 0 0 1 1 17 26 56 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 99 17 24 45 0 0 0 0 0 0 141 141 145 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+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 2 3 5 22 36 89 -+18 31 73 17 26 56 17 24 45 6 8 19 0 0 0 0 0 0 -+17 24 45 24 41 99 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 32 48 107 40 56 111 -+40 56 111 40 56 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 38 54 111 29 46 104 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 49 63 116 74 87 134 -+72 85 132 73 86 133 73 86 133 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 90 135 76 89 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 77 90 136 -+76 90 135 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+76 89 135 77 90 136 78 91 137 77 90 136 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 59 73 120 2 3 5 0 0 1 -+5 5 5 177 177 177 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+254 254 254 255 255 255 255 255 255 230 230 230 177 177 177 96 96 96 -+44 44 44 5 5 5 0 0 0 0 0 0 6 7 9 44 44 44 -+96 96 96 177 177 177 230 230 230 255 255 255 255 255 255 254 254 254 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 177 177 177 5 5 5 -+0 0 1 1 2 4 67 81 125 78 91 137 78 91 137 77 90 136 -+76 89 135 17 24 45 0 0 0 5 5 5 154 154 154 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 254 254 254 255 255 255 243 243 243 80 80 80 0 0 1 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 -+0 0 1 177 177 177 255 255 255 254 254 254 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 251 251 251 -+44 44 44 0 0 0 0 0 0 24 41 99 17 26 56 0 0 0 -+0 0 0 96 96 96 255 255 255 254 254 254 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 20 20 21 -+0 0 0 0 0 0 17 24 45 69 83 131 69 83 131 68 82 130 -+68 82 130 69 83 131 68 82 130 39 49 83 2 3 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 1 -+2 3 5 6 7 9 15 19 34 17 24 45 0 0 0 0 0 0 -+118 119 119 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 6 7 9 0 0 0 -+1 2 4 63 77 126 60 75 125 36 52 108 24 41 100 25 42 101 -+22 36 89 0 0 0 0 0 0 66 66 66 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 55 55 55 0 0 0 0 0 0 49 61 101 60 75 125 -+60 75 125 59 74 124 58 73 123 59 74 124 59 74 124 59 74 124 -+17 24 45 0 0 0 0 0 0 118 119 119 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 209 209 209 0 0 0 0 0 0 6 7 9 -+56 70 122 56 70 122 56 70 122 55 70 121 54 70 120 52 67 118 -+12 14 18 0 0 0 6 7 9 177 177 177 255 255 255 254 254 254 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 137 138 138 0 0 0 0 0 0 17 24 45 -+25 42 101 25 42 101 25 42 101 24 41 100 29 47 104 51 66 119 -+50 65 118 44 57 102 0 0 0 0 0 0 66 66 66 248 248 248 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 80 80 80 0 0 0 0 1 1 17 26 56 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 100 17 24 45 0 0 0 0 0 0 132 132 134 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 6 7 9 0 0 0 0 0 1 6 8 19 -+2 3 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+15 19 34 24 41 99 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 33 49 106 40 56 111 -+40 56 111 40 56 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 38 54 110 29 46 104 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 35 51 108 75 88 134 -+73 86 133 73 86 133 73 86 133 74 87 134 73 86 133 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 75 88 134 -+74 87 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 76 89 135 75 88 134 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+76 89 135 77 90 136 77 90 136 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 77 90 136 31 35 49 0 0 0 -+0 0 1 66 66 66 243 243 243 254 254 254 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 254 254 254 255 255 255 255 255 255 255 255 255 248 248 248 -+243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 -+248 248 248 254 254 254 255 255 255 255 255 255 254 254 254 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 254 254 254 248 248 248 66 66 66 0 0 1 -+0 0 0 31 35 49 78 91 137 78 91 137 78 91 137 78 91 137 -+75 88 134 17 24 45 0 0 0 5 5 5 154 154 154 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 254 254 254 255 255 255 254 254 254 137 138 138 -+1 2 4 0 0 0 0 0 0 0 0 0 0 0 0 31 31 31 -+209 209 209 254 254 254 255 255 255 254 254 254 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 230 230 230 -+0 0 0 0 0 0 6 8 19 25 42 101 18 31 73 1 2 4 -+0 0 0 12 14 18 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 254 254 254 255 255 255 177 177 177 -+0 0 1 0 0 0 0 0 0 15 19 34 49 61 101 62 76 125 -+62 76 125 49 61 101 17 24 45 0 1 1 0 0 0 0 0 1 -+44 44 44 209 209 209 177 177 177 154 154 154 132 132 134 96 96 96 -+66 66 66 44 44 44 6 7 9 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 31 35 49 33 41 67 0 0 0 0 0 0 -+118 119 119 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 6 7 9 0 0 0 -+1 2 4 63 77 126 59 74 124 33 49 106 24 41 100 25 42 101 -+22 36 89 0 0 0 0 0 0 66 66 66 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 55 55 55 0 0 0 0 0 0 49 61 101 60 75 125 -+60 75 125 59 74 124 58 73 123 59 74 124 59 74 124 59 74 124 -+33 41 67 0 1 1 0 0 0 80 80 80 243 243 243 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 132 132 134 0 0 0 0 0 0 17 26 56 -+56 70 122 56 70 122 56 70 122 55 70 121 54 70 120 55 70 121 -+17 24 45 0 0 0 0 0 0 118 119 119 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 80 80 80 0 0 0 0 0 0 18 31 73 -+25 42 101 25 42 101 25 42 101 24 41 100 31 47 105 52 67 118 -+50 65 118 44 57 102 0 0 0 0 0 0 66 66 66 248 248 248 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 80 80 80 0 0 0 0 1 1 17 26 56 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 100 17 24 45 0 0 0 0 0 0 118 119 119 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+254 254 254 255 255 255 80 80 80 0 0 0 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 8 19 24 40 99 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 34 50 107 40 56 111 -+40 56 111 40 56 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 38 54 110 29 45 103 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 100 27 44 103 70 84 131 -+73 86 133 73 86 133 73 86 133 73 86 133 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 88 135 76 89 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+77 90 136 76 90 135 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 76 89 135 77 90 136 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 69 82 127 0 1 1 -+0 0 0 0 0 1 154 154 154 255 255 255 254 254 254 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 254 254 254 255 255 255 177 177 177 0 0 1 0 0 0 -+0 0 0 71 84 128 78 91 137 78 91 137 77 90 136 78 91 137 -+74 87 133 17 24 45 0 0 0 5 5 5 154 154 154 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 255 255 255 -+248 248 248 177 177 177 132 132 134 132 132 134 177 177 177 255 255 255 -+255 255 255 254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 254 254 254 255 255 255 146 146 148 -+0 0 0 0 0 0 17 24 45 25 42 101 22 36 89 6 8 19 -+0 0 0 1 2 4 154 154 154 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 255 255 255 -+118 119 119 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 1 0 0 1 20 20 21 -+209 209 209 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 230 230 230 209 209 209 -+177 177 177 146 146 148 118 119 119 96 96 96 20 20 21 0 0 1 -+0 0 0 6 7 9 64 79 127 33 41 67 0 0 0 0 0 0 -+118 119 119 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 6 7 9 0 0 0 -+1 2 4 63 77 126 57 72 122 30 46 104 24 41 100 25 42 101 -+22 36 89 0 0 0 0 0 0 66 66 66 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 55 55 55 0 0 0 0 0 0 49 61 101 60 75 125 -+60 75 125 59 74 124 58 73 123 59 74 124 59 74 124 59 74 124 -+49 61 101 0 1 1 0 0 0 44 44 44 230 230 230 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+254 254 254 255 255 255 55 55 55 0 0 0 0 0 0 42 55 96 -+56 70 122 56 70 122 56 70 122 55 70 121 54 70 120 55 70 121 -+39 49 83 0 1 1 0 0 0 66 66 66 243 243 243 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 6 7 9 0 0 0 0 0 0 24 40 99 -+25 42 101 25 42 101 25 42 101 25 42 101 33 49 106 53 67 120 -+50 65 118 44 57 102 0 0 0 0 0 0 66 66 66 248 248 248 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 80 80 80 0 0 0 0 1 1 17 26 56 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 17 26 56 0 0 0 0 0 0 96 96 96 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 243 243 243 55 55 55 12 14 18 12 14 18 -+20 20 21 44 44 44 118 119 119 209 209 209 0 0 0 0 0 0 -+6 8 19 24 40 99 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 34 50 107 40 56 111 -+40 56 111 40 56 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 38 54 110 28 45 103 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 26 43 102 58 73 123 -+73 86 133 73 86 133 72 85 132 73 86 133 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 73 86 134 74 87 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+74 87 133 75 88 134 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 88 135 76 89 135 76 90 135 76 89 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 76 89 135 76 89 135 77 90 136 77 90 136 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 39 49 83 -+0 0 0 0 0 0 5 5 5 209 209 209 255 255 255 254 254 254 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+254 254 254 255 255 255 230 230 230 12 14 18 0 0 0 0 0 0 -+39 49 83 78 91 137 78 91 137 78 91 137 78 91 137 77 90 136 -+74 87 133 17 24 45 0 0 0 5 5 5 154 154 154 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 44 44 44 -+0 0 0 0 0 0 18 31 73 25 42 101 24 41 100 17 26 56 -+0 0 1 0 0 1 55 55 55 243 243 243 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+248 248 248 118 119 119 20 20 21 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 6 7 9 80 80 80 230 230 230 -+255 255 255 254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 254 254 254 254 254 254 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 243 243 243 20 20 21 0 0 0 -+0 0 0 39 49 83 66 80 127 33 41 67 0 0 0 0 0 0 -+118 119 119 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 6 7 9 0 0 0 -+1 2 4 63 77 126 57 72 122 26 43 101 24 41 100 25 42 101 -+22 36 89 0 0 0 0 0 0 66 66 66 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 55 55 55 0 0 0 0 0 0 49 61 101 60 75 125 -+60 75 125 59 74 124 58 73 123 59 74 124 59 74 124 59 74 124 -+59 74 124 2 3 5 0 0 0 6 7 9 209 209 209 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 243 243 243 0 0 0 0 0 0 1 2 4 55 68 119 -+56 70 122 56 70 122 56 70 122 55 70 121 54 70 120 55 70 121 -+49 65 116 1 2 4 0 0 0 20 20 21 209 209 209 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 230 230 230 0 0 0 0 0 0 6 8 19 24 41 99 -+25 42 101 25 42 101 25 42 101 25 42 101 35 52 107 52 67 118 -+50 65 118 44 57 102 0 0 0 0 0 0 66 66 66 248 248 248 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 80 80 80 0 0 0 0 1 1 17 26 56 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 101 17 26 56 0 0 0 0 0 0 66 66 66 255 255 255 -+254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 254 254 254 255 255 255 255 255 255 230 230 230 209 209 209 -+243 243 243 255 255 255 255 255 255 255 255 255 0 1 1 0 0 0 -+2 3 5 22 39 98 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 36 52 108 40 56 111 -+40 56 111 40 56 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 37 53 109 27 44 103 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 47 63 116 -+74 87 134 73 86 133 72 85 132 73 86 133 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 73 86 134 74 87 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+74 87 133 75 88 134 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 88 135 76 89 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 77 90 136 76 90 135 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 76 89 135 78 91 137 77 90 136 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 74 87 133 -+15 19 34 0 0 0 0 0 1 44 44 44 243 243 243 255 255 255 -+254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 -+255 255 255 243 243 243 55 55 55 0 0 1 0 0 0 15 19 34 -+73 86 130 78 91 137 77 90 136 78 91 137 78 91 137 77 90 136 -+75 88 134 17 24 45 0 0 0 5 5 5 154 154 154 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 254 254 254 255 255 255 177 177 177 0 0 0 -+0 0 0 6 8 19 22 36 89 25 42 101 24 41 100 42 55 96 -+6 7 9 0 0 1 5 5 5 154 154 154 255 255 255 254 254 254 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 -+255 255 255 254 254 254 209 209 209 132 132 134 80 80 80 44 44 44 -+44 44 44 66 66 66 118 119 119 177 177 177 248 248 248 255 255 255 -+254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+254 254 254 255 255 255 255 255 255 66 66 66 0 0 1 0 0 0 -+15 19 34 66 80 128 66 80 128 33 41 67 0 0 0 0 0 0 -+118 119 119 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 6 7 9 0 0 0 -+1 2 4 63 77 126 55 70 121 23 40 99 24 41 100 25 42 101 -+22 36 89 0 0 0 0 0 0 66 66 66 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 55 55 55 0 0 0 0 0 0 49 61 101 60 75 125 -+60 75 125 59 74 124 58 73 123 59 74 124 59 74 124 59 74 124 -+59 74 124 15 19 34 0 0 0 0 0 0 177 177 177 254 254 254 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 154 154 154 0 0 0 0 0 0 15 19 34 55 69 121 -+56 70 122 56 70 122 56 70 122 55 70 121 54 70 120 55 70 121 -+55 70 121 12 14 18 0 0 0 0 0 0 177 177 177 254 254 254 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 154 154 154 0 0 0 0 0 0 15 19 34 25 42 100 -+25 42 101 25 42 101 25 42 101 25 42 101 37 53 109 52 67 118 -+50 65 118 44 57 102 0 0 0 0 0 0 66 66 66 248 248 248 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 80 80 80 0 0 0 0 1 1 17 26 56 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 18 31 73 1 2 4 0 0 0 31 31 31 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 254 254 254 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 254 254 254 255 255 255 31 31 31 0 0 0 -+0 0 0 22 36 89 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 37 53 109 40 56 111 -+40 56 111 40 56 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 37 53 109 27 44 102 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 37 53 109 -+71 85 132 73 86 133 73 86 133 72 85 132 73 86 133 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 73 86 134 -+74 87 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 74 87 133 75 88 134 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 88 135 76 89 135 76 89 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 76 89 135 77 90 136 78 91 137 -+77 90 136 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+55 67 113 6 7 9 0 0 0 0 0 0 80 80 80 251 251 251 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+251 251 251 96 96 96 0 0 0 0 0 0 6 7 9 49 61 101 -+78 91 137 78 91 137 78 91 137 77 90 136 77 90 136 76 89 135 -+75 88 134 17 24 45 0 0 0 5 5 5 154 154 154 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 55 55 55 0 0 0 -+0 0 0 17 24 45 25 42 101 25 42 101 26 43 102 54 69 120 -+31 35 49 0 0 0 0 0 1 31 31 31 230 230 230 254 254 254 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+254 254 254 255 255 255 255 255 255 251 251 251 243 243 243 243 243 243 -+243 243 243 243 243 243 251 251 251 255 255 255 255 255 255 254 254 254 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+254 254 254 255 255 255 118 119 119 0 0 1 0 0 0 2 3 5 -+49 62 109 66 80 128 66 80 128 33 41 67 0 0 0 0 0 0 -+118 119 119 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 6 7 9 0 0 0 -+1 2 4 63 77 126 50 65 118 23 40 99 25 42 101 25 42 101 -+22 36 89 0 0 0 0 0 0 66 66 66 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 55 55 55 0 0 0 0 0 0 49 61 101 59 74 124 -+60 75 125 59 74 124 58 73 123 59 74 124 59 74 124 59 74 124 -+59 74 124 33 41 67 0 0 0 0 0 0 118 119 119 254 254 254 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 -+255 255 255 80 80 80 0 0 0 0 0 0 33 41 67 56 70 122 -+56 70 122 56 70 122 56 70 122 55 70 121 54 70 120 55 70 121 -+55 70 121 33 41 67 0 0 0 0 0 0 118 119 119 251 251 251 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 -+255 255 255 80 80 80 0 0 0 0 0 0 17 26 56 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 39 55 110 51 66 119 -+50 65 118 44 57 102 0 0 0 0 0 0 66 66 66 248 248 248 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 80 80 80 0 0 0 0 1 1 17 26 56 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 18 31 73 6 7 9 0 0 0 20 20 21 243 243 243 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 66 66 66 0 0 0 -+0 0 0 22 36 89 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 101 24 40 99 37 53 109 39 55 110 -+40 56 111 40 56 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 37 53 109 27 43 102 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 29 47 104 -+64 78 127 73 86 133 73 86 133 72 85 132 73 86 133 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 73 86 134 -+74 87 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 74 87 133 75 88 134 75 88 134 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 88 135 76 89 135 -+76 89 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 77 90 136 76 90 135 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 76 89 135 77 90 136 -+78 91 137 77 90 136 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 33 41 67 1 2 4 0 0 0 0 0 1 132 132 134 -+248 248 248 255 255 255 254 254 254 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 254 254 254 255 255 255 251 251 251 -+137 138 138 0 0 1 0 0 0 0 1 1 33 41 67 78 91 137 -+78 91 137 78 91 137 77 90 136 77 90 136 76 89 135 77 90 136 -+75 88 134 17 24 45 0 0 0 5 5 5 154 154 154 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 154 154 154 6 7 9 0 0 0 -+6 7 9 18 31 73 25 42 101 25 42 101 29 45 103 64 78 127 -+69 82 127 6 7 9 0 0 0 0 0 1 96 96 96 254 254 254 -+255 255 255 254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 177 177 177 12 14 18 0 0 0 0 0 0 33 41 67 -+66 80 128 66 80 128 66 80 128 33 41 67 0 0 0 0 0 0 -+118 119 119 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 6 7 9 0 0 0 -+1 2 4 63 77 126 44 59 113 23 40 99 25 42 101 25 42 101 -+22 36 89 0 0 0 0 0 0 66 66 66 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 55 55 55 0 0 0 0 0 0 49 61 101 60 75 125 -+59 74 124 59 74 124 58 73 123 59 74 124 59 74 124 59 74 124 -+59 74 124 49 61 101 0 0 0 0 0 0 55 55 55 251 251 251 -+254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 6 7 9 0 0 0 1 2 4 42 55 96 56 70 122 -+56 70 122 56 70 122 56 70 122 55 70 121 54 70 120 55 70 121 -+55 70 121 48 60 105 0 0 0 0 0 0 31 31 31 248 248 248 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 20 20 21 0 0 0 0 1 1 18 31 73 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 42 58 112 51 66 119 -+50 65 118 44 57 102 0 0 0 0 0 0 66 66 66 248 248 248 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 80 80 80 0 0 0 0 1 1 17 26 56 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 22 36 89 6 8 19 0 0 0 12 14 18 177 177 177 -+255 255 255 254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 96 96 96 0 0 0 -+0 0 0 18 31 73 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 25 42 100 38 54 109 39 55 111 -+40 56 111 40 56 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 36 52 108 26 43 101 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+56 71 121 73 86 133 73 86 133 72 85 132 72 85 132 73 86 133 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 73 86 134 -+73 86 134 74 87 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 74 87 133 75 88 134 75 88 134 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 88 135 76 89 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 76 89 135 76 89 135 -+77 90 136 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 31 35 49 0 0 0 0 0 0 0 0 1 -+132 132 134 248 248 248 255 255 255 254 254 254 254 254 254 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 254 254 254 254 254 254 255 255 255 248 248 248 132 132 134 -+0 0 1 0 0 0 0 0 0 31 35 49 78 91 137 78 91 137 -+78 91 137 77 90 136 77 90 136 76 89 135 77 90 136 77 90 136 -+75 88 134 17 24 45 0 0 0 5 5 5 154 154 154 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+254 254 254 255 255 255 230 230 230 44 44 44 0 0 0 0 0 0 -+15 19 34 25 42 101 25 42 101 24 41 100 33 49 106 73 86 133 -+72 85 132 49 61 101 0 0 0 0 0 0 0 0 1 132 132 134 -+255 255 255 255 255 255 254 254 254 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 255 255 255 -+209 209 209 31 31 31 0 0 0 0 0 0 15 19 34 59 73 120 -+66 80 129 66 80 128 66 80 128 33 41 67 0 0 0 0 0 0 -+118 119 119 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 6 7 9 0 0 0 -+1 2 4 63 77 126 38 54 110 23 40 100 25 42 101 25 42 101 -+22 36 89 0 0 0 0 0 0 66 66 66 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 55 55 55 0 0 0 0 0 0 49 61 101 60 75 125 -+59 74 124 58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 0 0 0 0 0 0 2 3 5 248 248 248 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+177 177 177 2 3 5 0 0 0 12 14 18 49 62 109 56 70 122 -+56 70 122 56 70 122 55 70 121 56 70 122 54 70 120 55 70 121 -+55 70 121 55 70 121 6 7 9 0 0 0 0 0 0 230 230 230 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+230 230 230 5 5 5 0 0 0 6 8 19 22 36 89 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 44 60 114 51 66 119 -+50 65 118 44 57 102 0 0 0 0 0 0 66 66 66 248 248 248 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 80 80 80 0 0 0 0 1 1 17 26 56 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 29 45 103 15 19 34 0 0 0 1 2 4 118 119 119 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 132 132 134 0 0 0 -+0 0 0 17 26 56 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 25 42 101 38 54 110 40 56 111 -+40 56 111 40 56 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 36 52 108 26 43 101 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 23 40 100 -+44 59 113 71 85 132 72 85 132 73 86 133 72 85 132 73 86 133 -+73 86 133 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+73 86 134 74 87 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 74 87 133 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 88 135 -+76 89 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 77 90 136 77 90 136 76 90 135 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 76 89 135 -+77 90 136 78 91 137 77 90 136 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 76 89 135 31 35 49 0 0 0 0 0 0 -+0 0 1 80 80 80 230 230 230 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 230 230 230 80 80 80 0 0 1 -+0 0 0 0 0 0 31 35 49 75 88 134 78 91 137 77 90 136 -+78 91 137 77 90 136 76 89 135 77 90 136 77 90 136 77 90 136 -+75 88 134 17 24 45 0 0 0 5 5 5 154 154 154 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 254 254 254 254 254 254 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 -+255 255 255 254 254 254 80 80 80 0 0 0 0 0 0 2 3 5 -+22 36 89 25 42 101 25 42 101 24 41 100 46 61 115 73 86 133 -+72 84 131 70 85 132 33 41 67 0 0 0 0 0 0 0 0 0 -+132 132 134 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 254 254 254 254 254 254 255 255 255 209 209 209 -+44 44 44 0 0 0 0 0 0 6 7 9 55 67 113 66 80 129 -+66 80 128 66 80 127 66 80 128 33 41 67 0 0 0 0 0 0 -+118 119 119 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 6 7 9 0 0 0 -+1 2 4 63 77 126 32 48 105 24 41 100 25 42 101 25 42 101 -+22 36 89 0 0 0 0 0 0 66 66 66 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 55 55 55 0 0 0 0 0 0 49 61 101 60 75 125 -+59 74 124 58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 15 19 34 0 0 0 0 0 0 209 209 209 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 255 255 255 -+118 119 119 0 1 1 0 0 0 17 24 45 55 69 121 56 70 122 -+56 70 122 56 70 122 56 70 122 54 70 120 55 70 121 55 70 121 -+55 70 121 55 70 121 17 26 56 0 0 0 0 0 0 141 141 145 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+154 154 154 5 5 5 0 0 0 6 8 19 22 39 98 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 47 63 116 51 66 119 -+50 65 118 44 57 102 0 0 0 0 0 0 66 66 66 248 248 248 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 80 80 80 0 0 0 0 1 1 17 26 56 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 30 46 104 33 41 67 0 1 1 0 0 0 55 55 55 -+230 230 230 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 154 154 154 0 0 0 -+0 0 0 17 24 45 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 26 43 102 38 54 110 40 56 111 -+40 56 111 40 56 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 36 52 108 25 42 101 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+28 45 103 69 83 130 73 86 133 73 86 133 72 85 132 73 86 133 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 73 86 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 74 87 133 76 89 135 75 88 134 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 90 135 76 89 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+76 89 135 77 90 136 78 91 137 77 90 136 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 74 87 130 31 35 49 0 0 0 -+0 0 0 0 0 0 31 31 31 177 177 177 255 255 255 255 255 255 -+254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 -+255 255 255 255 255 255 177 177 177 31 31 31 0 0 0 0 0 0 -+0 0 0 31 35 49 73 86 130 78 91 137 77 90 136 78 91 137 -+77 90 136 76 89 135 77 90 136 77 90 136 77 90 136 77 90 136 -+75 88 134 17 24 45 0 0 0 5 5 5 154 154 154 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 251 251 251 177 177 177 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 255 255 255 -+255 255 255 80 80 80 0 0 0 0 0 0 0 0 0 18 31 73 -+25 42 101 25 42 101 25 42 101 24 41 100 63 77 126 72 85 132 -+72 85 132 71 85 132 68 81 126 17 24 45 0 0 0 0 0 1 -+2 3 5 118 119 119 254 254 254 255 255 255 254 254 254 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 254 254 254 255 255 255 255 255 255 177 177 177 20 20 21 -+0 0 0 0 0 0 0 1 1 49 62 109 66 80 129 66 80 129 -+66 80 128 66 80 127 66 80 128 33 41 67 0 0 0 0 0 0 -+118 119 119 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 6 7 9 0 0 0 -+1 2 4 63 77 126 24 41 101 24 41 100 25 42 101 25 42 101 -+22 36 89 0 0 0 0 0 0 66 66 66 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 55 55 55 0 0 0 0 0 0 49 61 101 60 75 125 -+59 74 124 58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 31 35 49 0 0 0 0 0 0 132 132 134 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 -+55 55 55 0 0 0 0 1 1 33 41 67 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 54 70 120 55 70 121 55 70 121 -+55 70 121 55 70 121 42 55 96 0 0 0 0 0 0 55 55 55 -+255 255 255 254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 255 255 255 -+118 119 119 0 1 1 0 0 0 15 19 34 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 50 65 118 50 65 118 -+49 64 117 44 57 102 0 0 0 0 0 0 66 66 66 248 248 248 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 80 80 80 0 0 0 0 1 1 17 26 56 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 31 47 105 39 56 109 2 3 5 0 0 0 0 0 0 -+154 154 154 254 254 254 254 254 254 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 209 209 209 0 0 0 -+0 0 0 15 19 34 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 27 43 102 38 54 110 40 56 111 -+39 55 111 40 56 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 35 51 108 25 42 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 101 -+23 39 99 57 72 122 73 86 133 73 86 133 73 86 133 72 85 132 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 73 86 134 75 88 134 74 87 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 74 87 133 75 88 134 76 89 135 -+75 88 134 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 90 135 76 89 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 76 89 135 77 90 136 78 91 137 77 90 136 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 77 90 136 31 35 49 -+1 2 4 0 0 0 0 0 1 0 0 1 96 96 96 243 243 243 -+254 254 254 255 255 255 255 255 255 254 254 254 254 254 254 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 254 254 254 255 255 255 255 255 255 254 254 254 -+243 243 243 96 96 96 0 0 1 0 0 1 0 0 0 1 2 4 -+31 35 49 77 90 136 78 91 137 78 91 137 78 91 137 77 90 136 -+77 90 136 76 89 135 77 90 136 77 90 136 77 90 136 77 90 136 -+75 88 134 17 24 45 0 0 0 5 5 5 154 154 154 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 243 243 243 20 20 21 154 154 154 251 251 251 255 255 255 -+255 255 255 254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 254 254 254 255 255 255 255 255 255 243 243 243 -+66 66 66 0 0 0 0 0 0 0 0 0 17 26 56 25 42 101 -+25 42 101 25 42 101 24 41 100 31 47 105 73 86 133 72 85 132 -+71 85 132 71 85 132 71 85 132 67 81 125 15 19 34 0 0 0 -+0 0 0 0 0 1 80 80 80 243 243 243 254 254 254 255 255 255 -+255 255 255 254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 255 255 255 -+255 255 255 255 255 255 248 248 248 132 132 134 5 5 5 0 0 0 -+0 0 0 1 2 4 42 55 96 66 80 129 66 80 129 66 80 129 -+66 80 128 66 80 127 66 80 128 33 41 67 0 0 0 0 0 0 -+118 119 119 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 6 7 9 0 0 0 -+1 2 4 57 72 122 23 39 99 25 42 101 25 42 101 25 42 101 -+22 36 89 0 0 0 0 0 0 66 66 66 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 55 55 55 0 0 0 0 0 0 49 61 101 60 75 125 -+59 74 124 58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 58 73 123 42 55 96 0 0 0 0 0 0 66 66 66 -+255 255 255 254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 209 209 209 -+31 31 31 0 0 0 6 7 9 42 55 96 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 54 70 120 55 70 121 55 70 121 -+55 70 121 55 70 121 49 62 109 6 7 9 0 0 0 0 0 0 -+243 243 243 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+66 66 66 0 0 0 0 1 1 17 26 56 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 25 42 101 53 67 120 50 65 118 -+49 64 117 44 57 102 0 0 0 0 0 0 66 66 66 248 248 248 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 80 80 80 0 0 0 0 1 1 17 26 56 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 33 49 106 45 60 114 17 26 56 0 0 0 0 0 0 -+6 7 9 209 209 209 255 255 255 255 255 255 254 254 254 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 230 230 230 0 0 0 -+0 0 0 6 8 19 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 28 45 103 39 55 110 40 56 111 -+40 56 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 35 51 108 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+23 40 100 36 52 108 74 87 134 72 85 132 73 86 133 72 85 132 -+74 87 134 73 86 133 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 73 86 134 74 87 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 74 87 133 75 88 134 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 88 135 76 88 135 76 89 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 76 89 135 77 90 136 78 91 137 77 90 136 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+39 49 83 6 8 19 0 0 0 0 0 0 0 0 1 6 7 9 -+132 132 134 209 209 209 243 243 243 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 248 248 248 209 209 209 132 132 134 -+6 7 9 0 0 1 0 0 0 0 0 0 6 8 19 39 49 83 -+78 91 137 78 91 137 78 91 137 77 90 136 77 90 136 76 89 135 -+76 89 135 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+75 88 134 17 24 45 0 0 0 5 5 5 154 154 154 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 248 248 248 6 7 9 0 0 0 118 119 119 230 230 230 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 -+254 254 254 255 255 255 255 255 255 248 248 248 177 177 177 44 44 44 -+0 0 0 0 0 0 0 0 0 17 24 45 25 42 100 25 42 101 -+25 42 101 25 42 101 23 40 99 48 64 116 73 86 133 72 84 131 -+71 85 132 70 85 132 71 85 132 71 85 132 69 82 127 15 19 34 -+0 0 0 0 0 0 0 0 1 12 14 18 154 154 154 230 230 230 -+255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 254 254 254 254 254 254 255 255 255 255 255 255 255 255 255 -+230 230 230 177 177 177 66 66 66 0 0 0 0 0 0 0 0 0 -+6 7 9 18 31 73 63 77 126 66 80 129 66 80 128 66 80 129 -+66 80 128 66 80 127 66 80 128 33 41 67 0 0 0 0 0 0 -+118 119 119 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 6 7 9 0 0 0 -+1 2 4 49 64 117 23 40 99 25 42 101 25 42 101 25 42 101 -+22 36 89 0 0 0 0 0 0 66 66 66 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 55 55 55 0 0 0 0 0 0 49 61 101 60 75 125 -+59 74 124 58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 58 73 123 48 60 105 1 2 4 0 0 0 5 5 5 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 177 177 177 -+5 5 5 0 0 0 6 8 19 55 69 121 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 54 70 120 55 70 121 55 70 121 -+55 70 121 55 70 121 52 66 118 15 19 34 0 0 0 0 0 0 -+154 154 154 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 230 230 230 -+44 44 44 0 0 0 2 3 5 18 31 73 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 28 45 103 53 67 120 50 65 118 -+49 64 117 44 57 102 0 0 0 0 0 0 66 66 66 248 248 248 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 80 80 80 0 0 0 0 1 1 17 26 56 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 34 50 107 45 60 114 45 60 114 6 8 19 0 0 0 -+0 0 0 20 20 21 209 209 209 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 254 254 254 254 254 254 255 255 255 243 243 243 2 3 5 -+0 0 0 6 7 9 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 29 46 104 39 55 110 40 56 111 -+40 56 111 39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 -+39 55 111 38 54 110 34 50 107 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 23 39 99 67 80 128 73 86 133 72 85 132 73 86 133 -+73 86 133 74 87 134 73 86 133 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 74 87 133 75 88 134 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 88 135 76 89 135 76 90 135 76 89 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 77 90 136 76 90 135 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 76 89 135 77 90 136 78 91 137 -+78 91 137 77 90 136 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 59 73 120 31 35 49 0 0 0 0 0 0 0 0 1 -+0 0 0 12 14 18 80 80 80 132 132 134 177 177 177 243 243 243 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 254 254 254 255 255 255 255 255 255 255 255 255 254 254 254 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 209 209 209 141 141 145 80 80 80 20 20 21 0 0 0 -+0 0 1 0 0 0 0 0 0 31 35 49 59 73 120 78 91 137 -+77 90 136 78 91 137 78 91 137 77 90 136 76 89 135 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+75 88 134 17 24 45 0 0 0 5 5 5 154 154 154 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 248 248 248 6 7 9 0 0 0 0 0 0 44 44 44 -+132 132 134 230 230 230 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 254 254 254 254 254 254 255 255 255 255 255 255 255 255 255 -+255 255 255 251 251 251 177 177 177 96 96 96 6 7 9 0 0 1 -+0 0 0 0 0 0 17 26 56 24 41 99 25 42 101 25 42 101 -+25 42 101 24 41 100 23 40 100 67 80 128 72 85 132 72 85 132 -+71 85 132 70 85 132 71 85 132 71 85 132 71 85 132 69 82 127 -+33 41 67 1 2 4 0 0 0 0 0 1 0 0 0 44 44 44 -+118 119 119 177 177 177 243 243 243 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 243 243 243 177 177 177 118 119 119 -+66 66 66 0 0 0 0 0 0 0 0 0 0 0 0 6 8 19 -+18 31 73 43 59 113 66 80 129 66 80 129 66 80 129 66 80 128 -+66 80 127 66 80 128 66 80 128 33 41 67 0 0 0 0 0 0 -+118 119 119 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 6 7 9 0 0 0 -+1 2 4 40 56 111 23 40 100 25 42 101 25 42 101 25 42 101 -+22 36 89 0 0 0 0 0 0 66 66 66 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 55 55 55 0 0 0 0 0 0 49 61 101 59 74 124 -+58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 58 73 123 55 67 113 12 14 18 0 0 0 0 0 0 -+209 209 209 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 118 119 119 -+0 0 0 0 0 0 17 24 45 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 54 70 120 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 33 41 67 0 0 0 0 0 0 -+80 80 80 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 209 209 209 -+20 20 21 0 0 0 6 7 9 22 39 98 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 31 47 105 53 67 120 50 65 118 -+49 64 117 44 57 102 0 0 0 0 0 0 66 66 66 251 251 251 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 80 80 80 0 0 0 0 1 1 17 26 56 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 101 -+24 41 100 36 52 108 46 61 115 45 60 114 42 55 96 6 8 19 -+0 0 0 0 0 0 6 7 9 118 119 119 209 209 209 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 -+255 255 255 254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 251 251 251 209 209 209 20 20 21 -+0 0 0 0 1 1 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 29 47 104 39 55 110 40 56 111 -+40 56 111 39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 -+39 55 111 38 54 110 33 49 106 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 43 59 113 75 88 134 72 85 132 73 86 133 -+73 86 133 73 86 133 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 73 86 134 74 87 134 75 88 134 74 87 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 74 87 133 -+75 88 134 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 88 135 76 89 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 77 90 136 76 90 135 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 76 89 135 77 90 136 -+77 90 136 78 91 137 77 90 136 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 75 88 134 49 61 101 15 19 34 0 0 0 -+0 0 0 0 0 1 0 0 1 0 0 0 20 20 21 31 31 31 -+55 55 55 118 119 119 154 154 154 209 209 209 230 230 230 251 251 251 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 248 248 248 209 209 209 177 177 177 132 132 134 80 80 80 -+31 31 31 20 20 21 5 5 5 0 0 1 0 0 1 0 0 0 -+0 0 0 15 19 34 49 61 101 75 88 134 78 91 137 78 91 137 -+78 91 137 77 90 136 77 90 136 76 89 135 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 76 90 135 -+75 88 134 17 24 45 0 0 0 5 5 5 154 154 154 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 248 248 248 6 7 9 0 0 0 0 0 0 0 0 0 -+1 2 4 20 20 21 66 66 66 141 141 145 209 209 209 248 248 248 -+255 255 255 255 255 255 255 255 255 255 255 255 230 230 230 177 177 177 -+96 96 96 44 44 44 12 14 18 0 0 1 0 0 0 0 0 0 -+2 3 5 18 31 73 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 23 40 100 37 53 109 71 84 131 71 84 131 71 85 132 -+70 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+70 84 131 49 61 101 12 14 18 0 0 0 0 0 0 0 0 1 -+0 0 0 12 14 18 31 31 31 66 66 66 118 119 119 177 177 177 -+209 209 209 230 230 230 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 251 251 251 230 230 230 209 209 209 -+154 154 154 118 119 119 66 66 66 31 31 31 20 20 21 0 0 0 -+0 0 0 0 0 0 0 0 0 0 1 1 17 26 56 22 39 98 -+26 43 101 50 65 118 66 80 129 65 79 128 66 80 129 66 80 128 -+66 80 127 66 80 128 66 80 128 33 41 67 0 0 0 0 0 0 -+12 14 18 44 44 44 31 31 31 31 31 31 31 31 31 31 31 31 -+31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 -+31 31 31 31 31 31 31 31 31 31 31 31 0 1 1 0 0 0 -+1 2 4 31 47 105 24 41 100 25 42 101 25 42 101 25 42 101 -+22 36 89 0 0 0 0 0 0 6 7 9 44 44 44 31 31 31 -+31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 -+31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 -+44 44 44 6 7 9 0 0 0 0 0 0 49 61 101 59 74 124 -+58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 58 73 123 55 69 119 17 24 45 0 0 0 0 0 0 -+31 31 31 44 44 44 31 31 31 31 31 31 31 31 31 31 31 31 -+31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 -+31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 12 14 18 -+0 0 0 0 0 0 39 49 83 56 70 122 56 70 122 56 70 122 -+56 70 122 55 70 121 56 70 122 54 70 120 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 39 49 83 2 3 5 0 0 0 -+6 7 9 44 44 44 31 31 31 31 31 31 31 31 31 31 31 31 -+31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 -+31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 -+0 1 1 0 0 0 6 8 19 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 35 51 108 52 67 118 50 65 118 -+49 64 117 44 57 102 0 0 0 0 0 0 6 7 9 31 31 31 -+31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 -+31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 -+31 31 31 44 44 44 12 14 18 0 0 0 0 1 1 17 26 56 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 37 53 109 46 61 115 45 60 114 44 59 113 39 49 83 -+6 7 9 0 0 0 0 0 0 0 1 1 20 20 21 66 66 66 -+132 132 134 177 177 177 230 230 230 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 248 248 248 230 230 230 177 177 177 -+154 154 154 118 119 119 66 66 66 31 31 31 20 20 21 1 2 4 -+0 0 0 0 0 0 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 31 47 105 39 55 110 40 56 111 -+40 56 111 39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 -+39 55 111 38 54 110 31 47 105 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+31 47 105 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 28 45 103 68 82 130 73 86 133 73 86 133 -+72 85 132 73 86 133 74 87 134 73 86 133 74 87 134 74 87 134 -+74 87 134 74 87 134 73 86 134 74 87 134 74 87 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 74 87 133 -+75 88 134 75 88 134 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 88 135 76 90 135 76 89 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 76 89 135 -+76 89 135 77 90 136 78 91 137 77 90 136 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 55 67 113 -+15 19 34 0 1 1 0 1 1 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 6 7 9 20 20 21 20 20 21 20 20 21 6 7 9 -+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 1 1 0 1 1 15 19 34 -+49 61 101 78 91 137 78 91 137 78 91 137 78 91 137 77 90 136 -+77 90 136 77 90 136 76 89 135 76 89 135 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 76 90 135 77 90 136 -+74 88 133 17 24 45 0 0 0 5 5 5 154 154 154 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 248 248 248 6 7 9 0 0 0 0 0 1 0 1 1 -+0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 -+0 0 0 6 7 9 5 5 5 0 0 0 0 0 0 0 0 1 -+0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 17 24 45 -+24 40 99 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 23 40 99 55 70 121 71 84 131 72 85 132 71 85 132 -+70 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 70 84 131 69 83 130 33 41 67 6 7 9 0 0 1 -+0 0 1 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 5 5 5 6 7 9 -+6 7 9 2 3 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 1 0 1 1 15 19 34 22 36 89 25 42 101 25 42 101 -+28 45 103 58 73 123 66 80 129 66 80 129 66 80 129 66 80 128 -+66 80 127 66 80 128 66 80 128 33 41 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 -+1 2 4 25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 -+22 36 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 49 61 101 59 74 124 -+58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 58 73 123 57 72 122 33 41 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 55 69 121 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 55 70 121 54 70 120 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 48 60 105 6 8 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 17 24 45 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 39 55 111 51 66 119 50 65 118 -+49 64 117 44 57 102 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 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 17 26 56 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+25 42 101 38 54 110 46 61 115 44 59 113 45 60 114 45 60 114 -+42 55 96 6 8 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 6 7 9 -+6 7 9 5 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 1 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 32 50 106 39 55 110 40 56 111 -+40 56 111 39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 -+39 55 111 38 54 110 31 47 105 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+51 66 119 23 39 99 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 50 65 118 74 87 134 72 85 132 -+72 85 132 72 85 132 73 86 133 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 73 86 134 74 87 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+74 87 133 75 88 134 75 88 134 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 88 135 76 89 135 76 90 135 -+76 89 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+76 89 135 76 89 135 77 90 136 78 91 137 77 90 136 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 67 81 125 33 41 67 15 19 34 12 14 18 6 7 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 -+2 3 5 6 8 19 15 19 34 33 41 67 59 73 120 78 91 137 -+78 91 137 78 91 137 78 91 137 77 90 136 78 91 137 78 91 137 -+77 90 136 76 89 135 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 76 90 135 77 90 136 76 90 135 -+73 87 131 17 24 45 0 0 0 5 5 5 154 154 154 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 248 248 248 6 7 9 0 0 0 6 7 9 39 49 83 -+12 14 18 6 7 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 1 2 4 12 14 18 17 24 45 49 61 101 37 53 109 -+24 41 100 25 42 100 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 31 47 105 64 78 127 72 85 132 71 85 132 70 85 132 -+70 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 70 84 131 69 83 130 70 84 131 69 83 130 39 49 83 -+15 19 34 12 14 18 6 7 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 1 2 4 6 7 9 6 8 19 -+17 26 56 22 36 89 25 42 101 25 42 101 25 42 101 25 42 101 -+31 47 105 65 79 128 66 80 129 66 80 129 66 80 128 66 80 127 -+66 80 127 66 80 128 66 80 128 33 41 67 2 3 5 6 7 9 -+6 7 9 6 7 9 6 7 9 6 7 9 6 7 9 6 7 9 -+6 7 9 6 7 9 6 7 9 6 7 9 6 7 9 6 7 9 -+6 7 9 6 7 9 6 7 9 6 7 9 6 7 9 2 3 5 -+6 7 9 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+22 36 89 0 0 0 2 3 5 2 3 5 2 3 5 2 3 5 -+2 3 5 2 3 5 2 3 5 2 3 5 6 7 9 6 7 9 -+6 7 9 6 7 9 6 7 9 6 7 9 6 7 9 6 7 9 -+6 7 9 6 7 9 6 7 9 1 2 4 49 61 101 59 74 124 -+58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+58 73 123 59 74 124 57 72 122 39 49 83 6 7 9 6 7 9 -+2 3 5 2 3 5 2 3 5 2 3 5 2 3 5 2 3 5 -+2 3 5 2 3 5 2 3 5 2 3 5 2 3 5 2 3 5 -+2 3 5 2 3 5 2 3 5 2 3 5 2 3 5 2 3 5 -+1 2 4 15 19 34 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 15 19 34 2 3 5 -+2 3 5 2 3 5 2 3 5 2 3 5 2 3 5 2 3 5 -+2 3 5 2 3 5 2 3 5 2 3 5 2 3 5 2 3 5 -+2 3 5 2 3 5 2 3 5 2 3 5 2 3 5 2 3 5 -+2 3 5 1 2 4 18 31 73 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 23 40 100 43 60 114 51 66 119 49 64 117 -+49 64 117 44 57 102 0 1 1 2 3 5 2 3 5 2 3 5 -+2 3 5 2 3 5 2 3 5 2 3 5 2 3 5 2 3 5 -+2 3 5 2 3 5 2 3 5 2 3 5 2 3 5 2 3 5 -+2 3 5 2 3 5 2 3 5 2 3 5 2 3 5 17 26 56 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+26 43 101 40 56 111 46 61 115 44 59 113 45 60 114 45 60 114 -+45 60 114 45 60 114 33 41 67 6 8 19 2 3 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 1 2 4 6 7 9 6 8 19 -+6 8 19 17 26 56 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 34 50 106 40 56 111 40 56 111 -+40 56 111 39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 -+39 55 111 38 54 110 29 46 104 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+68 81 130 25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 36 52 108 70 83 130 73 86 133 -+73 86 133 72 85 132 73 86 133 73 86 133 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 73 86 134 74 87 134 -+74 87 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 74 87 133 75 88 134 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 88 135 76 89 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 77 90 136 -+76 90 135 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 76 89 135 76 89 135 77 90 136 77 90 136 -+78 91 137 77 90 136 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 67 81 125 49 61 101 -+39 49 83 33 41 67 31 35 49 15 19 34 12 14 18 12 14 18 -+6 7 9 2 3 5 2 3 5 1 2 4 2 3 5 5 5 5 -+6 7 9 12 14 18 15 19 34 17 24 45 31 35 49 33 41 67 -+49 61 101 59 73 120 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 77 90 136 78 91 137 78 91 137 77 90 136 76 89 135 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 76 90 135 76 90 135 -+74 88 133 17 24 45 0 0 0 5 5 5 154 154 154 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 248 248 248 6 7 9 0 0 0 5 5 5 75 88 134 -+71 84 128 49 61 101 33 41 67 31 35 49 15 19 34 12 14 18 -+6 7 9 2 3 5 5 5 5 6 7 9 12 14 18 17 24 45 -+31 35 49 39 49 83 55 67 113 73 86 133 62 76 125 23 40 99 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 42 58 112 71 84 131 72 85 132 71 85 132 70 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 70 84 131 -+70 84 131 69 83 130 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 59 73 120 42 55 96 33 41 67 31 35 49 17 24 45 -+15 19 34 12 14 18 6 8 19 6 7 9 2 3 5 2 3 5 -+2 3 5 6 7 9 6 7 9 6 8 19 12 14 18 15 19 34 -+15 19 34 15 19 34 17 26 56 18 31 73 22 36 89 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+38 56 110 68 82 130 65 79 128 66 80 129 66 80 128 66 80 127 -+66 80 128 66 80 128 66 80 128 55 67 113 42 55 96 42 55 96 -+42 55 96 42 55 96 42 55 96 42 55 96 42 55 96 42 55 96 -+42 55 96 42 55 96 42 55 96 42 55 96 42 55 96 42 55 96 -+42 55 96 42 55 96 42 55 96 42 55 96 42 55 96 42 55 96 -+39 49 83 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+22 39 98 18 31 73 18 31 73 18 31 73 18 31 73 18 31 73 -+18 31 73 18 31 73 18 31 73 33 41 67 39 49 83 42 55 96 -+42 55 96 42 55 96 42 55 96 42 55 96 42 55 96 42 55 96 -+42 55 96 42 55 96 39 49 83 39 49 83 56 69 119 59 74 124 -+58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 57 72 122 58 73 123 55 67 113 42 55 96 39 49 83 -+33 41 67 18 31 73 18 31 73 18 31 73 18 31 73 18 31 73 -+18 31 73 18 31 73 18 31 73 18 31 73 18 31 73 18 31 73 -+18 31 73 18 31 73 18 31 73 18 31 73 18 31 73 18 31 73 -+18 31 73 48 60 105 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 54 69 120 55 70 121 42 55 96 39 49 83 -+39 49 83 39 49 83 39 49 83 39 49 83 39 49 83 18 31 73 -+18 31 73 18 31 73 18 31 73 18 31 73 18 31 73 18 31 73 -+18 31 73 18 31 73 18 31 73 18 31 73 18 31 73 18 31 73 -+18 31 73 18 31 73 24 41 99 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 23 40 99 47 63 116 51 66 119 49 64 117 -+50 65 118 47 62 113 39 49 83 39 49 83 39 49 83 39 49 83 -+39 49 83 39 49 83 39 49 83 39 49 83 39 49 83 39 49 83 -+39 49 83 39 49 83 39 49 83 39 49 83 18 31 73 18 31 73 -+18 31 73 18 31 73 18 31 73 18 31 73 18 31 73 22 36 89 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+27 44 102 40 57 112 46 61 115 44 59 113 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 44 58 112 39 49 83 17 26 56 -+17 24 45 15 19 34 6 8 19 6 7 9 2 3 5 1 2 4 -+1 2 4 2 3 5 2 3 5 6 7 9 6 8 19 6 8 19 -+15 19 34 17 24 45 17 26 56 18 31 73 22 36 89 22 39 98 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 101 34 50 107 40 56 111 40 56 111 -+40 56 111 39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 -+39 55 111 38 54 110 27 44 103 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+70 84 131 43 59 113 23 40 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 25 42 101 57 72 122 73 86 133 -+73 86 133 73 86 133 72 85 132 73 86 133 73 86 133 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 73 86 134 74 87 134 -+75 88 134 74 87 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 76 89 135 75 88 134 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 88 135 -+76 89 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+77 90 136 76 90 135 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 76 89 135 77 90 136 -+77 90 136 78 91 137 77 90 136 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 74 87 130 71 84 128 67 81 125 67 81 125 -+67 81 125 59 73 120 59 73 120 59 73 120 59 73 120 59 73 120 -+67 81 125 67 81 125 69 82 127 73 86 130 76 89 135 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 77 90 136 -+78 91 137 78 91 137 77 90 136 77 90 136 76 89 135 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 76 90 135 77 90 136 76 90 135 76 90 135 76 90 135 -+74 88 133 17 24 45 0 0 0 5 5 5 154 154 154 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 248 248 248 6 7 9 0 0 0 5 5 5 75 88 134 -+75 88 134 75 88 134 74 87 134 71 84 128 67 81 125 59 73 120 -+59 73 120 59 73 120 59 73 120 59 73 120 67 81 125 68 81 126 -+71 84 131 73 86 133 72 85 132 74 87 133 38 54 109 23 40 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+26 43 102 56 71 121 73 85 132 72 84 131 71 85 132 70 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+70 84 131 69 83 130 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 69 83 131 69 83 131 68 82 130 68 82 130 67 81 125 -+59 73 120 59 73 120 59 73 120 55 67 113 55 67 113 55 67 113 -+55 67 113 55 67 113 55 67 113 58 72 120 59 73 120 59 73 120 -+25 42 100 24 41 99 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+51 66 119 67 81 129 66 80 129 66 80 128 66 80 128 66 80 127 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 65 79 128 -+65 79 128 64 78 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 64 78 127 63 77 126 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 62 76 125 64 78 127 -+37 53 109 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 46 61 115 61 75 125 59 74 124 -+61 75 125 61 75 125 60 75 125 61 75 125 59 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 58 73 123 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 57 72 122 58 73 123 58 73 123 58 73 123 57 72 122 -+35 52 107 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+35 52 107 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 53 68 119 46 61 115 23 40 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 40 99 50 65 118 50 65 118 49 64 117 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+49 65 117 48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 48 64 117 48 64 117 43 59 113 26 43 102 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+27 44 103 43 58 114 46 61 115 44 59 113 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 44 60 114 45 60 114 43 60 114 -+42 58 112 39 56 109 42 55 96 28 45 102 22 36 89 22 36 89 -+22 36 89 22 36 89 22 36 89 22 36 89 22 36 89 22 36 89 -+24 40 99 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 25 42 101 35 51 108 40 56 111 40 56 111 -+40 56 111 39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 -+39 55 111 38 54 110 26 43 102 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+72 85 132 58 73 123 26 43 102 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 23 40 100 39 55 110 71 85 132 -+72 85 132 73 86 133 72 85 132 73 86 133 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 73 86 134 -+74 87 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 76 89 135 75 88 134 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 88 135 -+76 89 135 76 90 135 76 89 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 76 89 135 -+77 90 136 77 90 136 78 91 137 78 91 137 77 90 136 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+77 90 136 77 90 136 76 89 135 76 89 135 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+76 90 135 77 90 136 76 90 135 76 90 135 76 90 135 76 90 135 -+74 88 133 17 24 45 0 0 0 5 5 5 154 154 154 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 248 248 248 6 7 9 0 0 0 5 5 5 75 88 134 -+74 87 134 75 88 134 74 87 134 73 86 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 73 86 133 74 87 134 72 85 132 -+73 86 133 72 85 132 73 86 133 62 76 125 23 40 99 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+32 48 107 71 85 132 72 85 132 72 85 132 70 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+69 83 130 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 69 83 131 68 82 130 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 68 82 130 67 81 129 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 59 74 124 -+23 39 99 25 42 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 100 24 41 100 -+63 77 126 66 80 129 66 80 129 66 80 129 66 80 128 66 80 127 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+65 79 128 64 78 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 63 77 126 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 63 77 126 62 76 125 -+31 47 105 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 27 44 102 51 66 119 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 60 75 125 59 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 58 73 123 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 57 72 122 58 73 123 58 73 123 57 72 122 57 72 122 -+29 46 104 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 23 40 100 -+40 56 111 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+55 70 121 56 70 122 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 54 69 120 53 68 119 54 69 120 -+54 69 120 54 69 120 54 69 120 53 68 119 42 58 112 23 40 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 27 43 102 51 66 119 50 65 118 49 64 117 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+49 65 117 48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 48 64 117 48 64 117 40 57 112 26 43 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+28 45 103 44 59 113 46 61 115 44 59 113 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 43 60 114 -+44 60 114 44 60 114 44 60 114 34 50 107 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 25 42 101 36 52 108 40 56 111 39 55 111 -+40 56 111 39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 -+39 55 111 38 54 110 25 42 101 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+72 85 132 68 82 130 35 51 108 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 23 39 99 63 77 126 -+73 86 133 73 86 133 73 86 133 72 85 132 74 87 134 73 86 133 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 75 88 134 74 87 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 74 87 133 74 87 133 75 88 134 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 88 135 76 89 135 76 90 135 76 89 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+76 89 135 76 89 135 77 90 136 77 90 136 78 91 137 78 91 137 -+77 90 136 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 77 90 136 78 91 137 78 91 137 77 90 136 77 90 136 -+77 90 136 76 89 135 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 76 90 135 -+77 90 136 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+74 88 133 17 24 45 0 0 0 5 5 5 154 154 154 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 248 248 248 6 7 9 0 0 0 5 5 5 75 88 134 -+75 88 134 74 87 134 73 86 134 73 86 134 74 87 134 74 87 134 -+74 87 134 74 87 134 73 86 133 74 87 134 73 86 133 73 86 133 -+73 86 133 73 86 133 75 88 134 34 50 107 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+51 67 118 73 86 133 72 84 131 71 85 132 70 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 70 84 131 71 85 132 -+69 83 130 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 68 82 130 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 67 81 129 68 82 130 -+68 82 130 68 82 130 68 82 130 68 81 130 69 83 131 43 59 113 -+23 40 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 33 49 106 -+68 81 130 66 80 129 66 80 129 66 80 129 66 80 127 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+64 78 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 63 77 126 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 63 77 126 64 78 127 63 77 126 56 71 121 -+29 46 103 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 29 46 104 56 70 122 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 59 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 58 73 123 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 -+59 74 124 57 72 122 58 73 123 58 73 123 58 73 123 57 72 122 -+23 40 99 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 23 40 99 -+46 61 115 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 55 70 121 54 70 120 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 54 69 120 53 68 119 54 69 120 -+54 69 120 54 69 120 54 69 120 53 68 119 37 53 109 23 40 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 31 47 105 51 66 119 50 65 118 49 64 117 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 -+48 65 116 48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 48 64 117 48 64 117 38 54 110 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+29 46 104 46 61 115 46 61 115 44 59 113 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 31 47 105 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 26 43 102 37 53 109 40 56 111 40 56 111 -+39 55 111 38 54 111 38 54 111 39 55 111 39 55 111 39 55 111 -+38 54 110 38 54 110 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+71 84 131 73 86 133 50 65 118 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 23 40 100 35 52 107 -+74 87 133 73 86 133 73 86 133 73 86 133 73 86 133 74 87 134 -+73 86 133 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+73 86 134 74 87 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 74 87 133 75 88 134 -+75 88 134 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 90 135 76 90 135 76 89 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 77 90 136 76 90 135 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 76 89 135 76 89 135 76 89 135 -+77 90 136 77 90 136 77 90 136 78 91 137 78 91 137 78 91 137 -+77 90 136 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+77 90 136 77 90 136 77 90 136 76 89 135 76 89 135 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+74 88 133 17 24 45 0 0 0 5 5 5 154 154 154 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 248 248 248 6 7 9 0 0 0 5 5 5 74 87 134 -+74 87 134 73 86 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 73 86 133 72 85 132 73 86 133 -+73 86 133 74 87 133 57 72 122 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 27 44 103 -+73 85 132 72 85 132 72 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 70 84 131 71 85 132 69 83 130 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 69 83 131 68 82 130 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 68 82 130 67 81 129 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 69 83 131 27 44 102 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 23 40 99 47 63 116 -+67 81 129 66 80 129 66 80 129 66 80 128 66 80 127 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 65 79 128 -+64 78 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 64 78 127 63 77 126 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 62 76 125 63 77 126 50 65 118 -+26 43 102 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 31 47 105 61 75 125 61 75 125 61 75 125 -+61 75 125 60 75 125 61 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 58 73 123 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 50 65 118 -+23 40 99 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+50 65 118 55 69 121 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 55 70 121 54 70 120 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 54 69 120 53 68 119 54 69 120 -+54 69 120 54 69 120 54 69 120 53 68 119 32 50 106 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 35 51 108 51 66 119 50 65 118 49 64 117 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 -+48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 48 64 117 48 64 117 36 52 108 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 100 -+30 48 104 47 63 116 45 60 114 44 59 113 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 29 46 103 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 27 44 102 38 54 109 40 56 111 40 56 111 -+39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 37 53 109 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+72 85 132 72 85 132 68 82 130 30 46 104 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 23 39 99 -+57 72 122 74 87 134 72 85 132 73 86 133 73 86 133 73 86 133 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 73 86 134 74 87 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 74 87 133 75 88 134 -+76 89 135 75 88 134 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 88 135 76 89 135 76 89 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 77 90 136 -+76 90 135 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+76 89 135 76 89 135 77 90 136 77 90 136 77 90 136 77 90 136 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 78 91 137 -+78 91 137 78 91 137 77 90 136 77 90 136 77 90 136 77 90 136 -+76 89 135 76 89 135 76 89 135 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 76 90 135 77 90 136 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+74 88 133 17 24 45 0 0 0 5 5 5 154 154 154 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 248 248 248 6 7 9 0 0 0 5 5 5 75 88 134 -+74 87 134 73 86 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 73 86 133 73 86 133 72 85 132 73 86 133 -+73 86 133 71 85 132 36 52 108 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 23 39 99 53 68 119 -+73 86 133 72 84 131 71 85 132 70 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 69 83 131 -+70 84 131 68 82 130 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 67 81 129 68 82 130 68 82 130 -+68 82 130 68 82 130 67 81 129 68 82 130 56 71 121 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 23 40 100 61 75 125 -+66 80 129 66 80 129 66 80 129 66 80 127 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 64 78 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 63 77 126 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 63 77 126 63 77 126 44 60 114 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 38 56 110 62 76 125 59 74 124 61 75 125 -+61 75 125 61 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 42 58 112 -+23 40 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 28 45 103 -+51 66 119 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 55 70 121 54 70 120 55 70 121 55 70 121 55 70 121 -+55 70 121 54 69 120 55 70 121 54 69 120 53 68 119 54 69 120 -+54 69 120 54 69 120 53 68 119 53 68 119 27 44 102 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 23 40 100 39 55 111 51 66 119 50 65 118 49 64 117 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 -+48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 48 64 117 48 64 117 34 50 107 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+34 50 106 46 61 115 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 44 60 114 -+44 60 114 43 59 113 44 61 114 26 43 101 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 27 44 103 39 55 110 40 56 111 40 56 111 -+39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 34 50 108 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+71 85 132 72 84 131 74 87 133 50 65 118 23 40 99 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+31 47 105 71 84 131 73 86 133 72 85 132 72 85 132 73 86 133 -+74 87 134 73 86 133 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 73 86 134 74 87 134 75 88 134 74 87 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 74 87 133 -+75 88 134 76 89 135 75 88 134 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 88 135 76 89 135 76 90 135 -+76 89 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+77 90 136 76 90 135 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 76 89 135 76 89 135 76 89 135 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 76 89 135 76 89 135 76 89 135 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+76 90 135 77 90 136 77 90 136 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+74 88 133 17 24 45 0 0 0 5 5 5 154 154 154 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 248 248 248 6 7 9 0 0 0 5 5 5 74 87 134 -+73 86 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 73 86 133 73 86 133 72 85 132 73 86 133 73 86 133 -+73 86 133 56 71 121 25 42 101 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 31 47 105 70 83 130 -+72 85 132 71 85 132 71 85 132 70 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 70 84 131 69 83 130 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 68 82 130 69 83 131 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 81 130 70 84 131 40 57 112 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 33 49 106 65 79 128 -+65 79 128 66 80 129 66 80 129 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 63 77 126 64 78 127 63 77 126 61 75 125 37 53 109 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 47 63 116 62 76 125 61 75 125 61 75 125 -+61 75 125 61 75 125 60 75 125 59 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+58 73 123 58 73 123 58 73 123 58 73 123 59 74 124 34 50 107 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 32 48 107 -+53 67 120 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 55 70 121 54 70 120 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 54 69 120 54 69 120 53 68 119 54 69 120 -+54 69 120 54 69 120 54 69 120 53 68 119 23 40 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 23 40 99 44 60 114 51 66 119 49 64 117 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 -+48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+48 64 117 49 65 117 47 63 116 32 48 107 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+36 52 108 46 61 115 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 24 41 100 24 41 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 28 45 103 39 55 110 40 56 111 40 56 111 -+39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 33 49 106 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+71 85 132 72 85 132 72 85 132 72 85 132 29 46 104 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 49 64 117 74 87 133 73 86 133 72 85 132 72 85 132 -+73 86 133 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 73 86 134 74 87 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+74 87 133 75 88 134 76 89 135 75 88 134 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 88 135 76 89 135 -+76 90 135 76 89 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 77 90 136 77 90 136 76 90 135 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 76 90 135 -+77 90 136 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+74 87 133 17 24 45 0 0 0 5 5 5 154 154 154 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 248 248 248 6 7 9 0 0 0 5 5 5 73 86 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+73 86 133 74 87 134 73 86 133 72 85 132 73 86 133 146 146 148 -+141 141 145 137 138 138 137 138 138 137 138 138 141 141 145 93 98 116 -+26 43 101 25 42 101 44 58 112 132 132 134 137 138 138 137 138 138 -+137 138 138 137 138 138 141 141 145 134 136 146 71 85 132 71 85 132 -+71 85 132 141 141 145 141 141 145 137 138 138 137 138 138 137 138 138 -+141 141 145 120 125 141 70 84 131 141 141 145 141 141 145 137 138 138 -+137 138 138 137 138 138 141 141 145 102 109 134 69 83 131 69 83 131 -+69 83 131 69 83 131 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 64 78 127 32 48 105 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 23 40 99 46 61 115 65 79 128 -+66 80 129 66 80 128 66 80 129 66 80 128 82 95 139 141 141 145 -+137 138 138 137 138 138 137 138 138 141 141 145 134 136 146 68 81 130 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 64 78 127 -+65 79 128 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 63 77 126 63 77 126 58 73 123 31 47 105 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 57 72 122 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 60 75 125 59 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 59 74 124 -+58 73 123 58 73 123 58 73 123 57 72 122 102 109 134 141 141 145 -+137 138 138 137 138 138 137 138 138 137 138 138 137 138 138 137 138 138 -+137 138 138 137 138 138 137 138 138 137 138 138 137 138 138 137 138 138 -+141 141 145 120 125 141 25 42 101 25 42 101 24 41 100 36 52 108 -+55 69 121 56 70 122 56 70 122 56 70 122 56 70 122 55 70 121 -+56 70 122 55 70 121 54 70 120 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 54 69 120 53 68 119 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 47 63 116 23 40 99 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 47 63 116 50 65 118 49 64 117 50 65 118 -+50 65 118 50 65 118 50 65 118 102 109 134 141 141 145 137 138 138 -+137 138 138 137 138 138 141 141 145 102 109 134 49 65 117 49 65 117 -+49 65 117 48 64 117 46 61 115 29 46 104 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+38 54 111 46 61 115 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 40 57 112 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 100 30 46 104 40 56 111 40 56 111 40 56 111 -+39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 31 47 105 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+70 85 132 71 85 132 72 85 132 72 85 132 56 70 122 23 40 99 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 31 47 105 65 79 128 73 86 133 73 86 133 73 86 133 -+72 85 132 73 86 133 73 86 133 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 73 86 134 74 87 134 75 88 134 -+74 87 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 74 87 133 75 88 134 76 89 135 75 88 134 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 77 90 136 77 90 136 -+76 90 135 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 89 135 76 90 135 -+74 88 133 17 24 45 0 0 0 5 5 5 154 154 154 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 248 248 248 6 7 9 0 0 0 5 5 5 73 86 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 73 86 133 -+74 87 134 72 85 132 73 86 133 73 86 133 72 85 132 137 138 138 -+55 55 55 12 14 18 20 20 21 20 20 21 66 66 66 102 109 134 -+29 46 103 25 42 101 59 73 120 118 119 119 31 31 31 20 20 21 -+20 20 21 20 20 21 44 44 44 146 146 148 76 90 135 71 85 132 -+72 85 132 141 141 145 44 44 44 20 20 21 20 20 21 20 20 21 -+80 80 80 120 125 141 70 84 131 141 141 145 55 55 55 12 14 18 -+20 20 21 20 20 21 96 96 96 102 109 134 69 83 131 69 83 131 -+69 83 131 69 83 131 68 82 130 67 81 129 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 55 69 121 27 44 102 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 101 58 73 123 66 80 129 -+66 80 129 66 80 129 66 80 128 66 80 127 82 95 139 96 96 96 -+20 20 21 20 20 21 20 20 21 55 55 55 120 125 141 67 80 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+64 78 127 63 77 126 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 63 77 126 63 77 126 55 70 121 23 40 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 27 44 103 63 77 126 59 74 124 61 75 125 61 75 125 -+60 75 125 61 75 125 60 75 125 59 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 -+57 72 122 58 73 123 58 73 123 58 73 123 102 109 134 80 80 80 -+20 20 21 20 20 21 20 20 21 20 20 21 20 20 21 20 20 21 -+20 20 21 20 20 21 20 20 21 20 20 21 20 20 21 12 14 18 -+66 66 66 120 125 141 25 42 101 24 41 100 24 41 100 40 56 111 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+55 70 121 54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 54 69 120 53 68 119 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 40 57 112 23 40 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 27 44 103 48 63 117 50 65 118 49 64 117 50 65 118 -+50 65 118 50 65 118 50 65 118 102 109 134 80 80 80 12 14 18 -+20 20 21 20 20 21 66 66 66 120 125 141 49 65 117 49 65 117 -+49 65 117 48 63 117 44 60 114 27 44 102 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+42 57 112 46 61 115 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 38 56 110 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 31 47 105 40 56 111 40 56 111 40 56 111 -+39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 29 46 104 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+70 85 132 71 85 132 71 85 132 71 84 131 70 84 131 35 52 107 -+23 40 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 100 23 40 100 46 61 115 72 85 132 72 85 132 73 86 133 -+72 85 132 73 86 133 74 87 134 73 86 133 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 73 86 134 74 87 134 -+75 88 134 74 87 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 74 87 133 75 88 134 76 89 135 75 88 134 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 88 135 76 88 135 76 89 135 76 90 135 76 89 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+76 90 135 77 90 136 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 89 135 76 90 135 76 89 135 -+74 87 133 17 24 45 0 0 0 5 5 5 154 154 154 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 248 248 248 6 7 9 0 0 0 5 5 5 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 73 86 133 74 87 134 -+73 86 133 73 86 133 73 86 133 72 85 132 73 86 133 120 125 141 -+66 66 66 0 0 0 0 0 0 0 0 0 31 31 31 120 125 141 -+32 48 105 26 43 102 102 108 129 80 80 80 0 0 1 0 0 0 -+0 0 0 0 0 0 0 0 0 137 138 138 97 107 139 71 85 132 -+82 95 139 141 141 145 0 0 0 0 0 0 0 0 0 0 0 0 -+96 96 96 120 125 141 70 84 131 141 141 145 44 44 44 0 0 0 -+0 0 0 0 0 0 80 80 80 102 109 134 69 83 131 69 83 131 -+69 83 131 68 82 130 67 81 129 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 67 81 129 44 59 113 24 40 99 24 41 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 34 50 107 62 76 125 66 80 129 -+66 80 128 66 80 129 66 80 128 66 80 127 82 95 139 96 96 96 -+0 0 0 0 0 0 0 0 0 31 31 31 118 119 119 67 80 128 -+65 79 128 65 79 128 65 79 128 65 79 128 64 78 127 65 79 128 -+64 78 127 63 77 126 64 78 127 64 78 127 64 78 127 64 78 127 -+63 77 126 64 78 127 63 77 126 63 77 126 46 61 115 23 40 99 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+23 40 100 39 55 111 62 76 125 61 75 125 61 75 125 61 75 125 -+61 75 125 60 75 125 60 75 125 59 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 59 74 124 58 73 123 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 -+57 72 122 58 73 123 58 73 123 58 73 123 102 109 134 66 66 66 -+0 0 0 0 0 0 0 0 0 0 0 0 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 55 55 120 125 141 25 42 101 24 41 100 25 42 101 45 60 114 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+55 70 121 54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 54 69 120 53 68 119 54 69 120 54 69 120 -+54 69 120 54 69 120 55 70 121 34 50 107 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 29 47 104 48 64 117 51 66 119 49 64 117 50 65 118 -+50 65 118 50 65 118 50 65 118 102 109 134 66 66 66 0 0 0 -+0 0 0 0 0 0 44 44 44 120 125 141 49 65 117 49 65 117 -+49 65 117 48 63 117 43 59 113 25 42 101 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+44 60 114 46 61 115 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 44 60 114 43 60 114 44 60 114 -+44 60 114 44 60 114 36 52 108 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 33 49 106 40 56 111 40 56 111 40 56 111 -+39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 27 44 102 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+71 85 132 70 85 132 71 85 132 72 85 132 72 85 132 57 72 122 -+26 43 101 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 25 42 101 62 76 125 73 86 133 72 85 132 -+73 86 133 72 85 132 73 86 133 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 73 86 134 74 87 134 -+74 87 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 74 87 133 75 88 134 76 89 135 -+75 88 134 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 88 135 76 89 135 76 90 135 76 89 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 77 90 136 77 90 136 77 90 136 76 90 135 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 89 135 76 90 135 76 89 135 76 88 135 -+73 86 133 17 24 45 0 0 0 5 5 5 154 154 154 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 248 248 248 6 7 9 0 0 0 5 5 5 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 73 86 133 -+73 86 133 72 85 132 73 86 133 73 86 133 74 87 134 93 98 116 -+96 96 96 0 0 0 0 0 0 0 0 0 20 20 21 118 119 119 -+34 50 106 28 45 102 120 125 141 55 55 55 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 96 96 96 120 125 141 71 85 132 -+102 109 134 118 119 119 0 0 0 0 0 0 0 0 0 1 2 4 -+118 119 119 97 107 139 70 84 131 141 141 145 96 96 96 66 66 66 -+66 66 66 66 66 66 118 119 119 102 109 134 69 83 131 69 83 131 -+69 83 131 68 82 130 67 81 129 68 82 130 68 82 130 68 82 130 -+68 82 130 67 81 129 64 78 127 31 47 105 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 43 59 113 66 80 129 66 80 129 -+66 80 129 66 80 128 66 80 128 66 80 127 82 95 139 96 96 96 -+0 1 1 0 0 0 0 0 0 31 31 31 118 119 119 67 80 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 64 78 127 -+64 78 127 63 77 126 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 63 77 126 63 77 126 63 77 126 34 50 107 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+23 40 99 50 65 118 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 60 75 125 59 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 59 74 124 58 73 123 59 74 124 -+59 74 124 59 74 124 59 74 124 58 73 123 59 74 124 58 73 123 -+57 72 122 58 73 123 57 72 122 59 74 124 97 107 139 66 66 66 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+44 44 44 120 125 141 25 42 101 24 41 100 27 44 103 49 64 117 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+55 70 121 54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 54 69 120 53 68 119 54 69 120 54 69 120 -+54 69 120 53 68 119 55 70 121 28 45 103 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 34 50 107 50 65 118 50 65 118 49 64 117 50 65 118 -+50 65 118 50 65 118 50 65 118 102 109 134 66 66 66 0 0 0 -+0 0 0 0 0 0 44 44 44 120 125 141 49 65 117 49 65 117 -+49 65 117 48 63 117 40 57 112 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 26 43 101 -+47 63 116 46 61 115 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 44 60 114 43 60 114 44 60 114 -+44 60 114 44 60 114 32 50 106 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 35 52 107 40 56 111 40 56 111 39 55 111 -+39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 38 54 110 -+39 55 111 25 42 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+71 85 132 70 85 132 70 85 132 71 85 132 72 85 132 70 84 131 -+37 53 109 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 31 47 105 73 87 133 73 86 133 -+73 86 133 73 86 133 73 86 133 74 87 134 73 86 133 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 73 86 134 -+73 86 134 74 87 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 74 87 133 75 88 134 -+76 89 135 75 88 134 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 88 135 76 89 135 76 90 135 -+76 90 135 76 89 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 77 90 136 77 90 136 -+76 90 135 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 76 90 135 77 90 136 77 90 136 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 89 135 76 90 135 76 89 135 76 88 135 76 88 135 -+74 87 133 17 24 45 0 0 0 5 5 5 154 154 154 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 248 248 248 6 7 9 0 0 0 5 5 5 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 73 86 133 -+72 85 132 73 86 133 72 85 132 74 87 134 52 67 118 55 67 113 -+118 119 119 6 7 9 0 0 0 0 0 0 12 14 18 118 119 119 -+49 62 109 30 48 104 132 132 134 31 31 31 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 44 44 44 141 141 145 71 85 132 -+120 125 141 96 96 96 0 0 0 0 0 0 0 0 0 6 7 9 -+146 146 148 80 93 136 70 84 131 120 125 141 120 125 141 120 125 141 -+120 125 141 120 125 141 120 125 141 82 95 139 69 83 131 69 83 131 -+68 82 130 67 81 129 67 81 129 68 82 130 68 82 130 68 82 130 -+68 82 130 73 87 131 62 76 125 23 40 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 32 48 105 -+34 50 106 34 50 106 34 50 106 53 67 120 66 80 129 65 79 128 -+66 80 129 66 80 128 66 80 127 66 80 128 82 95 139 96 96 96 -+0 1 1 0 0 0 0 0 0 31 31 31 118 119 119 68 81 130 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 64 78 127 -+63 77 126 70 83 130 70 83 130 71 84 128 65 79 128 64 78 127 -+64 78 127 63 77 126 63 77 126 61 75 125 23 40 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 33 50 105 -+34 50 106 34 50 106 34 50 106 25 42 101 25 42 101 24 41 100 -+24 40 99 59 74 124 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 60 75 125 62 76 125 67 80 128 67 80 128 67 80 128 -+64 78 127 60 75 125 60 75 125 59 74 124 58 73 123 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 57 72 122 -+57 72 122 58 73 123 58 73 123 59 74 124 97 107 139 66 66 66 -+0 0 0 0 0 0 0 0 0 0 0 0 96 96 96 137 138 138 -+137 138 138 137 138 138 137 138 138 137 138 138 137 138 138 137 138 138 -+141 141 145 120 125 141 25 42 101 24 41 100 29 46 104 53 67 120 -+56 70 122 56 70 122 56 70 122 56 70 122 63 77 126 63 77 126 -+55 70 121 54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 54 69 120 59 73 120 59 73 120 61 75 125 57 72 122 -+54 69 120 54 69 120 53 68 119 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 34 50 106 34 50 106 34 50 106 32 48 105 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 37 53 109 51 66 119 49 64 117 52 67 118 58 72 120 -+58 72 120 52 66 118 50 65 118 102 109 134 66 66 66 0 0 0 -+0 0 0 0 0 0 44 44 44 120 125 141 49 65 117 48 64 117 -+49 65 117 47 63 116 38 54 109 23 40 100 25 42 101 27 44 102 -+34 50 106 34 50 106 33 50 105 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 30 48 104 34 50 106 34 50 106 24 41 100 29 46 104 -+47 63 116 45 60 114 44 59 113 45 60 114 52 66 118 52 67 118 -+52 66 118 45 60 114 45 60 114 44 60 114 43 60 114 44 60 114 -+43 60 114 44 61 114 29 46 104 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 36 52 108 40 56 111 40 56 111 39 55 111 -+38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+38 54 110 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+71 85 132 71 85 132 70 85 132 71 85 132 72 84 131 73 85 132 -+59 74 124 27 44 102 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 44 60 114 74 87 134 -+73 86 133 72 85 132 72 85 132 73 86 133 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+73 86 134 74 87 134 75 88 134 74 87 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 74 87 133 -+75 88 134 76 89 135 75 88 134 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 88 135 76 88 135 -+76 89 135 76 90 135 76 90 135 76 89 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+76 90 135 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 89 135 76 90 135 -+76 90 135 76 89 135 76 88 135 76 88 135 76 89 135 76 89 135 -+74 87 133 17 24 45 0 0 0 2 3 5 118 119 119 177 177 177 -+177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 -+177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 -+177 177 177 177 177 177 6 7 9 0 0 0 5 5 5 74 87 134 -+74 87 134 74 87 134 73 86 133 74 87 134 73 86 133 72 85 132 -+73 86 133 73 86 133 73 86 133 65 79 128 31 47 105 32 48 105 -+132 132 134 31 31 31 0 0 0 0 0 0 0 0 0 96 96 96 -+67 81 125 67 81 125 118 119 119 6 7 9 0 0 0 0 0 0 -+1 2 4 0 0 0 0 0 0 6 7 9 146 146 148 80 93 136 -+141 141 145 55 55 55 0 0 0 0 0 0 0 0 0 44 44 44 -+141 141 145 73 86 133 69 83 131 120 125 141 132 132 134 120 125 141 -+120 125 141 120 125 141 120 125 141 97 107 139 69 83 131 97 107 139 -+134 136 146 120 125 141 120 125 141 120 125 141 132 132 134 120 125 141 -+141 141 145 137 138 138 137 138 138 141 141 145 120 125 141 32 48 105 -+25 42 101 27 44 102 59 73 120 120 125 141 141 141 145 137 138 138 -+137 138 138 137 138 138 137 138 138 141 141 145 120 125 141 97 107 139 -+68 81 130 66 80 128 66 80 127 66 80 128 82 95 139 96 96 96 -+0 1 1 0 0 0 0 0 0 31 31 31 118 119 119 68 81 130 -+65 79 128 65 79 128 65 79 128 68 82 130 102 109 134 134 136 146 -+141 141 145 137 138 138 137 138 138 137 138 138 141 141 145 137 138 138 -+120 125 141 80 93 136 63 77 126 49 64 117 23 40 99 25 42 101 -+25 42 101 32 48 105 93 98 116 132 132 134 141 141 145 137 138 138 -+137 138 138 137 138 138 137 138 138 141 141 145 132 132 134 74 87 130 -+39 56 109 59 74 124 61 75 125 61 75 125 61 75 125 73 86 130 -+120 125 141 137 138 138 141 141 145 137 138 138 137 138 138 137 138 138 -+137 138 138 141 141 145 120 125 141 80 93 136 60 75 125 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 57 72 122 -+58 73 123 58 73 123 58 73 123 54 69 120 97 107 139 66 66 66 -+0 0 0 0 0 0 0 0 0 0 0 0 118 119 119 93 98 116 -+49 62 109 49 62 109 49 62 109 49 62 109 49 62 109 49 62 109 -+49 62 109 44 58 112 67 81 125 120 125 141 120 125 141 120 125 141 -+120 125 141 132 132 134 102 109 134 141 141 145 137 138 138 137 138 138 -+141 141 145 120 125 141 61 75 125 55 70 121 57 72 122 80 93 136 -+132 132 134 141 141 145 137 138 138 137 138 138 137 138 138 137 138 138 -+141 141 145 120 125 141 74 87 130 26 43 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 29 46 103 55 67 113 120 125 141 -+141 141 145 137 138 138 137 138 138 137 138 138 137 138 138 141 141 145 -+120 125 141 59 73 120 30 46 104 25 42 101 25 42 101 24 41 100 -+24 41 100 40 57 112 69 82 127 120 125 141 141 141 145 137 138 138 -+137 138 138 141 141 145 120 125 141 120 125 141 66 66 66 0 0 0 -+0 0 0 0 0 0 44 44 44 120 125 141 49 65 117 49 65 117 -+48 64 117 47 63 116 49 63 116 102 108 129 137 138 138 141 141 145 -+137 138 138 137 138 138 137 138 138 141 141 145 120 125 141 67 81 125 -+27 44 102 25 42 101 25 42 101 25 42 101 36 52 108 120 125 141 -+120 125 141 120 125 141 120 125 141 120 125 141 74 87 130 74 87 130 -+137 138 138 137 138 138 137 138 138 137 138 138 141 141 145 102 109 134 -+58 72 120 55 68 119 102 109 134 141 141 145 137 138 138 137 138 138 -+137 138 138 137 138 138 80 93 136 46 61 115 43 60 114 44 60 114 -+44 60 114 44 60 114 27 44 102 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 38 54 110 40 56 111 40 56 111 39 55 111 -+38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+36 52 108 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+71 85 132 71 85 132 71 85 132 70 85 132 71 85 132 72 84 131 -+74 87 133 42 58 112 23 40 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 58 73 123 -+74 87 133 73 85 132 73 86 133 72 85 132 73 86 133 73 86 133 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 73 86 134 74 87 134 75 88 134 74 87 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+74 87 133 75 88 134 76 89 135 75 88 134 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 88 135 76 89 135 76 89 135 76 90 135 76 90 135 76 89 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 77 90 136 -+77 90 136 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 89 135 76 90 135 76 89 135 -+76 89 135 76 88 135 76 89 135 76 89 135 76 89 135 76 89 135 -+74 87 133 17 24 45 0 0 0 0 0 0 1 2 4 2 3 5 -+2 3 5 2 3 5 2 3 5 2 3 5 2 3 5 2 3 5 -+2 3 5 2 3 5 2 3 5 2 3 5 2 3 5 2 3 5 -+2 3 5 2 3 5 0 0 0 0 0 0 5 5 5 74 87 134 -+74 87 134 74 87 134 74 87 134 73 86 133 72 85 132 73 86 133 -+73 86 133 72 85 132 72 85 132 42 58 112 23 40 100 30 46 104 -+120 125 141 44 44 44 0 0 0 0 0 0 0 0 0 80 80 80 -+102 108 129 120 125 141 96 96 96 0 0 0 0 0 0 2 3 5 -+55 55 55 0 0 0 0 0 0 2 3 5 118 119 119 102 109 134 -+146 146 148 31 31 31 0 0 0 0 0 0 0 0 0 80 80 80 -+134 136 146 70 84 131 70 84 131 141 141 145 80 80 80 44 44 44 -+55 55 55 55 55 55 96 96 96 102 109 134 68 82 130 97 107 139 -+132 132 134 44 44 44 55 55 55 55 55 55 96 96 96 154 154 154 -+96 96 96 20 20 21 5 5 5 55 55 55 137 138 138 38 54 109 -+36 52 108 102 109 134 132 132 134 96 96 96 44 44 44 20 20 21 -+5 5 5 5 5 5 20 20 21 44 44 44 96 96 96 132 132 134 -+134 136 146 74 87 130 66 80 128 66 80 128 82 95 139 96 96 96 -+0 1 1 0 0 0 0 0 0 31 31 31 118 119 119 68 81 130 -+65 79 128 65 79 128 80 93 136 141 141 145 118 119 119 80 80 80 -+31 31 31 12 14 18 2 3 5 6 7 9 31 31 31 55 55 55 -+96 96 96 137 138 138 120 125 141 39 55 110 24 41 100 25 42 101 -+49 62 109 134 136 146 118 119 119 80 80 80 31 31 31 12 14 18 -+0 1 1 2 3 5 12 14 18 31 31 31 66 66 66 132 132 134 -+120 125 141 68 81 126 61 75 125 61 75 125 97 107 139 141 141 145 -+118 119 119 55 55 55 31 31 31 6 7 9 0 1 1 5 5 5 -+20 20 21 44 44 44 96 96 96 137 138 138 102 109 134 61 75 125 -+59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 57 72 122 -+58 73 123 57 72 122 58 73 123 48 64 116 82 95 139 66 66 66 -+0 0 0 0 0 0 0 0 0 0 0 0 118 119 119 71 84 128 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 93 98 116 96 96 96 55 55 55 55 55 55 -+44 44 44 118 119 119 146 146 148 80 80 80 12 14 18 6 7 9 -+66 66 66 146 146 148 69 82 127 68 81 126 134 136 146 132 132 134 -+80 80 80 44 44 44 12 14 18 2 3 5 6 7 9 20 20 21 -+55 55 55 96 96 96 132 132 134 102 108 129 33 50 105 25 42 101 -+25 42 101 25 42 101 36 52 108 102 109 134 132 132 134 96 96 96 -+44 44 44 20 20 21 2 3 5 6 7 9 20 20 21 44 44 44 -+96 96 96 132 132 134 120 125 141 36 52 108 25 42 101 24 41 100 -+26 43 102 74 87 130 141 141 145 96 96 96 44 44 44 6 7 9 -+6 7 9 31 31 31 96 96 96 141 141 145 66 66 66 0 0 0 -+0 0 0 0 0 0 44 44 44 120 125 141 49 65 117 49 65 117 -+49 65 117 97 107 139 141 141 145 118 119 119 66 66 66 31 31 31 -+6 7 9 5 5 5 20 20 21 44 44 44 96 96 96 132 132 134 -+120 125 141 44 58 112 25 42 101 25 42 101 39 56 109 118 119 119 -+55 55 55 55 55 55 55 55 55 80 80 80 146 146 148 132 132 134 -+80 80 80 20 20 21 5 5 5 12 14 18 44 44 44 118 119 119 -+120 125 141 146 146 148 118 119 119 55 55 55 12 14 18 5 5 5 -+20 20 21 80 80 80 137 138 138 93 98 116 43 60 114 44 60 114 -+44 60 114 42 58 112 27 43 102 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 101 25 42 101 40 56 111 40 56 111 40 56 111 39 55 111 -+38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+34 50 107 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 72 84 131 -+72 85 132 69 83 130 29 46 104 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 33 49 106 -+67 81 129 73 86 133 73 86 133 73 86 133 72 85 132 73 86 133 -+73 86 133 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 73 86 134 74 87 134 75 88 134 74 87 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 74 87 133 75 88 134 76 89 135 75 88 134 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 88 135 76 88 135 76 89 135 76 89 135 76 90 135 -+76 89 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 89 135 76 90 135 76 89 135 76 89 135 -+76 88 135 76 88 135 76 89 135 76 89 135 76 89 135 76 89 135 -+74 87 133 17 24 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 5 5 5 74 87 134 -+74 87 134 73 86 133 74 87 134 72 85 132 73 86 133 73 86 133 -+72 85 132 73 86 133 55 69 121 24 41 100 24 41 100 27 44 102 -+102 109 134 66 66 66 0 0 0 0 0 0 0 0 0 55 55 55 -+120 125 141 137 138 138 55 55 55 0 0 0 0 0 0 6 7 9 -+118 119 119 6 7 9 0 0 0 0 1 1 80 80 80 141 141 145 -+146 146 148 0 0 0 0 0 0 0 0 0 0 0 0 118 119 119 -+102 109 134 69 83 131 70 84 131 134 136 146 44 44 44 0 0 0 -+0 0 0 0 0 0 80 80 80 102 109 134 69 83 131 97 107 139 -+118 119 119 0 0 0 0 0 0 0 0 0 66 66 66 118 119 119 -+5 5 5 0 0 0 0 0 0 55 55 55 132 132 134 30 48 104 -+120 125 141 118 119 119 31 31 31 0 0 0 0 0 0 0 0 0 -+5 5 5 5 5 5 0 0 0 0 0 0 0 0 0 31 31 31 -+118 119 119 134 136 146 73 86 130 66 80 128 82 95 139 96 96 96 -+0 1 1 0 0 0 0 0 0 31 31 31 118 119 119 68 81 130 -+65 79 128 80 93 136 146 146 148 96 96 96 12 14 18 0 0 0 -+0 0 0 0 0 0 6 7 9 0 0 0 0 0 0 0 0 0 -+0 0 0 55 55 55 132 132 134 93 98 116 24 41 100 30 48 104 -+120 125 141 96 96 96 12 14 18 0 0 0 0 0 0 20 20 21 -+44 44 44 31 31 31 0 0 0 0 0 0 0 0 0 20 20 21 -+118 119 119 102 109 134 61 75 125 73 86 130 141 141 145 66 66 66 -+0 0 0 0 0 0 0 0 0 31 31 31 44 44 44 20 20 21 -+0 0 0 0 0 0 0 0 0 44 44 44 132 132 134 80 93 136 -+59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 57 72 122 -+58 73 123 58 73 123 58 73 123 42 58 112 93 98 116 66 66 66 -+0 0 0 0 0 0 0 0 0 0 0 0 118 119 119 120 125 141 -+102 109 134 102 109 134 102 109 134 102 109 134 102 109 134 102 108 129 -+55 67 113 25 42 101 97 107 139 66 66 66 0 0 0 0 0 0 -+0 0 0 118 119 119 96 96 96 0 0 0 0 0 0 0 0 0 -+80 80 80 134 136 146 67 81 125 141 141 145 96 96 96 20 20 21 -+0 0 0 0 0 0 0 0 0 5 5 5 2 3 5 0 0 0 -+0 0 0 0 0 0 44 44 44 118 119 119 102 108 129 25 42 101 -+25 42 101 33 50 105 120 125 141 118 119 119 31 31 31 0 0 0 -+0 0 0 0 0 0 2 3 5 5 5 5 0 0 0 0 0 0 -+0 0 0 31 31 31 118 119 119 120 125 141 30 48 104 24 41 100 -+49 62 109 146 146 148 80 80 80 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 55 55 55 66 66 66 0 0 0 -+0 0 0 0 0 0 44 44 44 120 125 141 49 65 117 49 65 117 -+82 95 139 137 138 138 66 66 66 0 1 1 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 31 31 -+96 96 96 134 136 146 36 52 108 25 42 101 39 56 109 118 119 119 -+6 7 9 0 0 0 0 0 0 55 55 55 118 119 119 31 31 31 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20 20 21 -+132 132 134 96 96 96 6 7 9 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 55 55 55 141 141 145 43 60 114 44 60 114 -+44 60 114 40 56 111 26 43 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 27 44 102 40 56 111 39 55 110 40 56 111 39 55 111 -+38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+32 48 107 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+72 84 131 72 85 132 59 74 124 23 40 99 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+43 59 113 72 85 132 72 85 132 73 86 133 72 85 132 73 86 133 -+74 87 134 73 86 133 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 73 86 134 73 86 134 74 87 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 74 87 133 75 88 134 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 88 135 76 88 135 76 89 135 76 89 135 -+76 90 135 76 89 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 89 135 76 90 135 76 90 135 76 89 135 76 88 135 76 88 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 75 88 134 75 88 134 74 87 133 -+74 87 133 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 74 87 134 75 88 134 74 87 134 73 86 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+73 86 133 74 87 134 73 86 133 73 86 133 73 86 133 72 85 132 -+73 86 133 67 80 128 25 42 101 24 41 100 25 42 101 25 42 101 -+74 87 130 96 96 96 5 5 5 0 0 0 0 0 0 31 31 31 -+137 138 138 141 141 145 20 20 21 0 0 0 0 0 0 44 44 44 -+137 138 138 31 31 31 0 0 0 0 0 0 44 44 44 154 154 154 -+118 119 119 0 0 0 0 0 0 0 0 0 0 0 0 146 146 148 -+82 95 139 70 84 131 69 83 131 134 136 146 55 55 55 0 0 0 -+0 0 0 0 0 0 80 80 80 102 109 134 69 83 131 97 107 139 -+118 119 119 0 0 0 0 0 0 0 0 0 12 14 18 20 20 21 -+0 0 0 0 0 0 0 0 0 118 119 119 71 84 128 74 87 130 -+132 132 134 20 20 21 0 0 0 0 0 0 1 2 4 66 66 66 -+118 119 119 118 119 119 80 80 80 5 5 5 0 0 0 0 0 0 -+20 20 21 118 119 119 97 107 139 66 80 128 82 95 139 96 96 96 -+0 1 1 0 0 0 0 0 0 31 31 31 118 119 119 68 81 130 -+68 81 130 120 125 141 96 96 96 5 5 5 0 0 0 0 0 0 -+12 14 18 96 96 96 118 119 119 118 119 119 44 44 44 0 0 0 -+0 0 0 0 0 0 55 55 55 141 141 145 44 58 112 44 58 112 -+132 132 134 20 20 21 0 0 0 0 0 0 44 44 44 118 119 119 -+120 125 141 132 132 134 80 80 80 5 5 5 12 14 18 31 31 31 -+80 80 80 141 141 145 61 75 125 82 95 139 118 119 119 6 7 9 -+0 0 0 0 0 0 66 66 66 132 132 134 132 132 134 118 119 119 -+55 55 55 2 3 5 20 20 21 31 31 31 118 119 119 120 125 141 -+59 74 124 59 74 124 59 74 124 58 73 123 58 73 123 57 72 122 -+58 73 123 58 73 123 57 72 122 37 53 109 93 98 116 66 66 66 -+0 0 0 0 0 0 0 0 0 0 0 0 44 44 44 55 55 55 -+55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 118 119 119 -+71 84 128 25 42 101 93 98 116 66 66 66 0 1 1 0 0 0 -+0 0 0 31 31 31 6 7 9 0 0 0 0 0 0 5 5 5 -+137 138 138 97 107 139 102 109 134 118 119 119 12 14 18 0 0 0 -+0 0 0 5 5 5 80 80 80 118 119 119 118 119 119 66 66 66 -+0 0 0 0 0 0 0 0 0 31 31 31 141 141 145 59 73 120 -+25 42 101 93 98 116 132 132 134 20 20 21 0 0 0 0 0 0 -+0 0 0 80 80 80 118 119 119 118 119 119 80 80 80 0 0 0 -+0 0 0 0 0 0 12 14 18 137 138 138 93 98 116 24 41 100 -+102 109 134 118 119 119 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 12 14 18 0 0 0 0 0 0 12 14 18 0 0 0 -+0 0 0 0 0 0 44 44 44 120 125 141 49 65 117 59 73 120 -+141 141 145 66 66 66 0 0 0 0 0 0 0 0 0 1 2 4 -+44 44 44 66 66 66 20 20 21 0 0 0 0 0 0 0 0 0 -+12 14 18 118 119 119 102 108 129 26 43 101 39 56 109 118 119 119 -+12 14 18 0 0 0 0 0 0 44 44 44 31 31 31 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+31 31 31 5 5 5 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 132 132 134 44 60 114 44 60 114 -+44 60 114 37 53 109 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 30 46 104 40 56 111 40 56 111 39 55 111 39 55 111 -+38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+30 46 104 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+71 85 132 71 85 132 71 85 132 71 85 132 70 85 132 71 85 132 -+72 85 132 71 84 131 71 84 131 44 60 114 23 40 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 100 -+23 39 99 56 71 121 73 86 133 73 86 133 72 85 132 73 86 133 -+73 86 133 74 87 134 74 87 134 73 86 133 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 73 86 134 74 87 134 -+75 88 134 74 87 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 74 87 133 74 87 133 75 88 134 -+76 89 135 75 88 134 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 90 135 76 90 135 76 89 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 89 135 76 90 135 76 90 135 76 90 135 -+76 89 135 76 89 135 76 88 135 76 88 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+75 88 134 76 89 135 75 88 134 75 88 134 74 87 133 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+74 87 134 75 88 134 75 88 134 73 86 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 73 86 133 -+74 87 134 73 86 133 72 85 132 73 86 133 72 85 132 73 86 133 -+71 85 132 31 47 105 24 41 100 25 42 101 25 42 101 25 42 101 -+59 73 120 118 119 119 6 7 9 0 0 0 0 0 0 6 7 9 -+137 138 138 118 119 119 0 0 1 0 0 0 0 0 0 96 96 96 -+154 154 154 55 55 55 0 0 0 0 0 0 20 20 21 132 132 134 -+96 96 96 0 0 0 0 0 0 0 0 0 31 31 31 146 146 148 -+73 87 133 70 84 131 69 83 131 134 136 146 55 55 55 0 0 0 -+0 0 0 0 0 0 80 80 80 102 109 134 68 82 130 97 107 139 -+118 119 119 0 0 0 0 0 0 0 0 0 0 0 0 1 2 4 -+96 96 96 137 138 138 132 132 134 132 132 134 39 56 109 141 141 145 -+66 66 66 0 0 0 0 0 0 0 0 0 55 55 55 146 146 148 -+67 81 125 82 95 139 141 141 145 66 66 66 0 0 0 0 0 0 -+0 0 1 66 66 66 134 136 146 67 80 128 82 95 139 96 96 96 -+0 1 1 0 0 0 0 0 0 31 31 31 118 119 119 68 81 130 -+74 87 130 132 132 134 31 31 31 0 0 1 0 0 0 2 3 5 -+96 96 96 141 141 145 82 95 139 102 109 134 146 146 148 20 20 21 -+0 0 0 0 0 0 0 0 0 118 119 119 102 108 129 44 58 112 -+102 108 129 6 7 9 0 0 0 0 0 0 80 80 80 146 146 148 -+67 81 125 67 81 125 137 138 138 137 138 138 137 138 138 137 138 138 -+141 141 145 134 136 146 61 75 125 97 107 139 80 80 80 0 1 1 -+0 0 0 5 5 5 96 96 96 134 136 146 80 93 136 102 109 134 -+141 141 145 137 138 138 137 138 138 141 141 145 137 138 138 120 125 141 -+59 74 124 59 74 124 58 73 123 59 74 124 57 72 122 58 73 123 -+58 73 123 58 73 123 54 70 120 31 47 105 93 98 116 66 66 66 -+0 0 0 0 0 0 0 0 0 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 96 96 -+71 84 128 25 42 101 93 98 116 66 66 66 0 1 1 0 0 0 -+0 0 0 0 0 0 0 0 0 96 96 96 137 138 138 132 132 134 -+146 146 148 62 76 125 137 138 138 44 44 44 0 0 0 0 0 0 -+0 0 0 80 80 80 141 141 145 80 93 136 102 109 134 146 146 148 -+31 31 31 0 0 0 0 0 0 0 0 0 96 96 96 120 125 141 -+29 45 103 134 136 146 44 44 44 0 0 0 0 0 0 0 0 0 -+66 66 66 146 146 148 74 87 130 71 84 128 146 146 148 66 66 66 -+0 0 0 0 0 0 0 0 0 55 55 55 134 136 146 36 52 108 -+141 141 145 44 44 44 0 0 0 0 0 0 0 0 0 5 5 5 -+118 119 119 141 141 145 137 138 138 44 44 44 0 0 0 0 0 0 -+0 0 0 0 0 0 44 44 44 120 125 141 49 65 117 102 109 134 -+118 119 119 0 0 0 0 0 0 0 0 0 6 7 9 96 96 96 -+141 141 145 132 132 134 132 132 134 44 44 44 0 0 0 0 0 0 -+0 0 0 55 55 55 137 138 138 27 44 102 39 56 109 118 119 119 -+12 14 18 0 0 0 0 0 0 0 0 0 6 7 9 96 96 96 -+137 138 138 96 96 96 6 7 9 0 0 0 0 0 0 0 0 0 -+0 0 0 20 20 21 118 119 119 132 132 134 44 44 44 0 0 0 -+0 0 0 0 0 0 0 0 0 96 96 96 44 60 114 43 59 113 -+44 60 114 35 51 108 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 32 48 105 40 56 111 40 56 111 40 56 111 38 54 111 -+39 55 111 39 55 111 39 55 111 39 55 111 38 54 110 39 55 111 -+28 45 102 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 70 85 132 -+71 85 132 71 85 132 72 85 132 65 79 128 31 47 105 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 25 42 100 61 75 125 74 87 134 72 85 132 73 86 133 -+72 85 132 73 86 133 73 86 133 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 73 86 134 -+74 87 134 75 88 134 74 87 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 74 87 133 -+75 88 134 76 89 135 76 89 135 75 88 134 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 88 135 76 88 135 76 88 135 76 89 135 76 89 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 89 135 76 90 135 76 89 135 76 89 135 76 89 135 -+76 88 135 76 88 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 75 88 134 -+76 89 135 75 88 134 75 88 134 74 87 133 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 74 87 134 74 87 134 73 86 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 73 86 133 74 87 134 -+73 86 133 72 85 132 73 86 133 73 86 133 73 86 133 72 85 132 -+40 57 112 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+49 62 109 132 132 134 12 14 18 0 0 0 0 0 0 0 0 0 -+132 132 134 80 80 80 0 0 0 0 0 0 0 0 0 137 138 138 -+146 146 148 80 80 80 1 2 4 0 0 0 6 7 9 118 119 119 -+66 66 66 0 0 0 0 0 0 0 0 0 66 66 66 134 136 146 -+70 84 131 69 83 131 68 82 130 134 136 146 55 55 55 0 0 0 -+0 0 0 0 0 0 80 80 80 102 109 134 68 82 130 97 107 139 -+118 119 119 0 0 0 0 0 0 0 0 0 0 0 1 66 66 66 -+146 146 148 67 81 125 93 98 116 67 81 125 55 67 113 146 146 148 -+6 7 9 0 0 0 0 0 0 0 0 0 118 119 119 93 98 116 -+34 50 106 69 83 130 102 109 134 118 119 119 6 7 9 0 0 0 -+0 0 0 31 31 31 132 132 134 68 82 130 82 95 139 96 96 96 -+0 1 1 0 0 0 0 0 0 31 31 31 118 119 119 67 81 129 -+97 107 139 96 96 96 5 5 5 0 0 0 0 0 0 31 31 31 -+132 132 134 76 90 135 67 80 128 70 83 130 134 136 146 66 66 66 -+0 0 0 0 0 0 0 0 0 66 66 66 134 136 146 39 56 109 -+118 119 119 6 7 9 0 0 0 0 0 0 12 14 18 96 96 96 -+137 138 138 137 138 138 141 141 145 141 141 145 102 109 134 71 84 128 -+61 75 125 60 75 125 61 75 125 97 107 139 96 96 96 2 3 5 -+0 0 0 0 0 0 44 44 44 118 119 119 137 138 138 141 141 145 -+141 141 145 141 141 145 102 109 134 71 84 128 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 58 73 123 57 72 122 58 73 123 -+58 73 123 58 73 123 52 67 118 25 42 101 93 98 116 66 66 66 -+0 0 0 0 0 0 0 0 0 0 0 0 1 2 4 2 3 5 -+2 3 5 2 3 5 2 3 5 2 3 5 0 0 0 96 96 96 -+71 84 128 25 42 101 93 98 116 66 66 66 0 1 1 0 0 0 -+0 0 0 0 0 0 96 96 96 146 146 148 97 107 139 102 109 134 -+80 93 136 69 82 127 118 119 119 12 14 18 0 0 0 0 0 0 -+20 20 21 118 119 119 80 93 136 57 72 122 58 72 120 120 125 141 -+96 96 96 0 0 0 0 0 0 0 0 0 44 44 44 146 146 148 -+55 67 113 132 132 134 6 7 9 0 0 0 0 0 0 0 0 0 -+132 132 134 102 108 129 25 42 101 25 42 101 102 108 129 132 132 134 -+0 0 0 0 0 0 0 0 0 6 7 9 134 136 146 67 81 125 -+146 146 148 0 0 0 0 0 0 0 0 0 0 0 0 80 80 80 -+141 141 145 74 87 130 120 125 141 146 146 148 6 7 9 0 0 0 -+0 0 0 0 0 0 44 44 44 120 125 141 49 65 117 141 141 145 -+66 66 66 0 0 0 0 0 0 0 0 0 44 44 44 146 146 148 -+49 62 109 25 42 101 102 109 134 118 119 119 6 7 9 0 0 0 -+0 0 0 12 14 18 118 119 119 49 62 109 39 56 109 118 119 119 -+12 14 18 0 0 0 0 0 0 0 0 0 96 96 96 141 141 145 -+71 84 128 141 141 145 44 44 44 0 0 0 0 0 0 0 0 0 -+1 2 4 137 138 138 120 125 141 102 109 134 146 146 148 6 7 9 -+0 0 0 0 0 0 0 0 0 80 80 80 44 60 114 44 60 114 -+44 60 114 33 49 106 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 35 52 107 40 56 111 40 56 111 40 56 111 38 54 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+26 43 102 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+70 85 132 71 85 132 71 85 132 73 86 133 55 70 121 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 29 47 104 64 78 127 74 87 133 72 85 132 -+73 86 133 72 85 132 73 86 133 74 87 134 73 86 133 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+73 86 134 74 87 134 75 88 134 74 87 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+74 87 133 75 88 134 75 88 134 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 88 135 76 88 135 76 89 135 -+76 89 135 76 90 135 76 90 135 76 90 135 76 89 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 89 135 76 90 135 -+76 90 135 76 90 135 76 89 135 76 89 135 76 88 135 76 88 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 75 88 134 76 89 135 -+75 88 134 75 88 134 74 87 133 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 74 87 134 -+74 87 134 74 87 134 73 86 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 73 86 133 74 87 134 73 86 133 -+72 85 132 73 86 133 73 86 133 72 85 132 73 85 132 50 65 118 -+25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+33 50 105 134 136 146 31 31 31 0 0 0 0 0 0 0 0 0 -+55 55 55 20 20 21 0 0 0 0 0 0 20 20 21 146 146 148 -+102 109 134 118 119 119 6 7 9 0 0 0 0 0 0 55 55 55 -+20 20 21 0 0 0 0 0 0 0 0 0 96 96 96 120 125 141 -+69 83 131 69 83 131 68 82 130 134 136 146 55 55 55 0 0 0 -+0 0 0 0 0 0 80 80 80 102 109 134 68 82 130 97 107 139 -+118 119 119 0 0 0 0 0 0 0 0 0 6 7 9 93 98 116 -+71 84 128 24 41 100 25 42 101 25 42 101 67 81 125 132 132 134 -+0 0 0 0 0 0 0 0 0 0 0 0 118 119 119 118 119 119 -+118 119 119 118 119 119 118 119 119 96 96 96 12 14 18 0 0 0 -+0 0 0 12 14 18 118 119 119 73 86 130 82 95 139 96 96 96 -+0 1 1 0 0 0 0 0 0 31 31 31 118 119 119 67 81 129 -+102 109 134 96 96 96 0 0 0 0 0 0 0 0 0 31 31 31 -+118 119 119 118 119 119 118 119 119 118 119 119 132 132 134 66 66 66 -+0 0 0 0 0 0 0 0 0 31 31 31 146 146 148 39 56 109 -+134 136 146 44 44 44 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 20 20 21 44 44 44 66 66 66 96 96 96 132 132 134 -+134 136 146 74 87 130 61 75 125 80 93 136 132 132 134 20 20 21 -+0 0 0 0 0 0 0 0 0 0 0 0 6 7 9 31 31 31 -+44 44 44 80 80 80 118 119 119 132 132 134 120 125 141 68 81 126 -+59 74 124 59 74 124 59 74 124 57 72 122 58 73 123 58 73 123 -+58 73 123 57 72 122 46 61 115 23 40 99 93 98 116 66 66 66 -+0 0 0 0 0 0 0 0 0 0 0 0 66 66 66 80 80 80 -+80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 132 132 134 -+71 84 128 25 42 101 93 98 116 66 66 66 0 1 1 0 0 0 -+0 0 0 2 3 5 141 141 145 80 93 136 56 70 122 54 70 120 -+55 70 121 80 93 136 96 96 96 0 0 0 0 0 0 0 0 0 -+31 31 31 118 119 119 118 119 119 118 119 119 118 119 119 132 132 134 -+96 96 96 0 0 0 0 0 0 0 0 0 0 1 1 146 146 148 -+74 87 130 96 96 96 6 7 9 0 0 0 0 0 0 12 14 18 -+118 119 119 118 119 119 118 119 119 118 119 119 118 119 119 118 119 119 -+0 0 0 0 0 0 0 0 0 1 2 4 118 119 119 102 108 129 -+132 132 134 0 0 0 0 0 0 0 0 0 0 0 0 132 132 134 -+97 107 139 50 65 118 50 65 118 141 141 145 55 55 55 0 0 0 -+0 0 0 0 0 0 44 44 44 120 125 141 49 65 117 146 146 148 -+31 31 31 0 0 0 0 0 0 0 0 0 96 96 96 102 108 129 -+25 42 101 25 42 101 36 52 108 132 132 134 31 31 31 0 0 0 -+0 0 0 0 0 0 118 119 119 67 81 125 38 54 109 118 119 119 -+12 14 18 0 0 0 0 0 0 12 14 18 118 119 119 55 67 113 -+25 42 101 93 98 116 80 80 80 0 1 1 0 0 0 0 0 0 -+44 44 44 141 141 145 49 63 116 49 63 116 134 136 146 31 31 31 -+0 0 0 0 0 0 0 0 0 80 80 80 44 60 114 44 60 114 -+43 59 113 31 47 105 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 37 53 109 40 56 111 40 56 111 40 56 111 38 54 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 37 53 109 -+26 43 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+70 85 132 71 85 132 72 84 131 72 85 132 73 86 133 43 58 114 -+23 40 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 36 52 108 68 82 130 73 86 133 -+73 86 133 73 86 133 72 85 132 73 86 133 74 87 134 73 86 133 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+73 86 134 73 86 134 74 87 134 75 88 134 74 87 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+74 87 133 74 87 133 74 87 133 75 88 134 76 89 135 75 88 134 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 88 135 76 88 135 -+76 88 135 76 89 135 76 89 135 76 89 135 76 90 135 76 90 135 -+76 89 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 89 135 76 90 135 76 90 135 76 90 135 76 89 135 -+76 89 135 76 89 135 76 88 135 76 88 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 75 88 134 76 89 135 76 89 135 75 88 134 -+74 87 133 74 87 133 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 74 87 134 75 88 134 -+74 87 134 73 86 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 73 86 133 72 85 132 -+73 86 133 73 86 133 72 85 132 73 86 133 59 74 124 25 42 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 102 109 134 80 80 80 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 80 80 80 134 136 146 -+80 93 136 134 136 146 20 20 21 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 1 132 132 134 97 107 139 -+69 83 131 68 82 130 69 83 131 134 136 146 55 55 55 0 0 0 -+0 0 0 0 0 0 80 80 80 102 109 134 67 81 129 97 107 139 -+118 119 119 0 0 0 0 0 0 0 0 0 20 20 21 118 119 119 -+42 57 112 24 41 100 25 42 101 25 42 101 67 81 125 118 119 119 -+0 0 0 0 0 0 0 0 0 0 0 0 12 14 18 12 14 18 -+12 14 18 12 14 18 12 14 18 5 5 5 0 0 0 0 0 0 -+0 0 0 0 0 0 118 119 119 80 93 136 82 95 139 96 96 96 -+0 1 1 0 0 0 0 0 0 31 31 31 118 119 119 67 81 129 -+102 109 134 80 80 80 0 0 0 0 0 0 0 0 0 5 5 5 -+12 14 18 12 14 18 12 14 18 12 14 18 20 20 21 0 0 0 -+0 0 0 0 0 0 0 0 0 5 5 5 146 146 148 27 44 102 -+93 98 116 137 138 138 55 55 55 12 14 18 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20 20 21 -+96 96 96 134 136 146 66 80 127 66 80 127 120 125 141 118 119 119 -+44 44 44 5 5 5 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 44 44 44 118 119 119 120 125 141 -+59 74 124 59 74 124 59 74 124 57 72 122 58 73 123 58 73 123 -+58 73 123 57 72 122 37 53 109 23 40 100 80 93 136 66 66 66 -+0 0 0 0 0 0 0 0 0 0 0 0 118 119 119 120 125 141 -+74 87 130 80 93 136 80 93 136 80 93 136 80 93 136 74 87 130 -+49 62 109 24 41 100 93 98 116 66 66 66 0 1 1 0 0 0 -+0 0 0 31 31 31 141 141 145 56 70 122 55 70 121 54 70 120 -+55 70 121 82 95 139 96 96 96 0 0 0 0 0 0 0 0 0 -+5 5 5 12 14 18 12 14 18 12 14 18 12 14 18 20 20 21 -+0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 141 141 145 -+93 98 116 96 96 96 5 5 5 0 0 0 0 0 0 2 3 5 -+12 14 18 12 14 18 12 14 18 12 14 18 12 14 18 6 7 9 -+0 0 0 0 0 0 0 0 0 0 0 0 96 96 96 102 109 134 -+118 119 119 0 0 0 0 0 0 0 0 0 0 0 0 146 146 148 -+68 81 126 50 65 118 50 65 118 120 125 141 66 66 66 0 0 0 -+0 0 0 0 0 0 44 44 44 120 125 141 55 69 119 146 146 148 -+12 14 18 0 0 0 0 0 0 0 0 0 96 96 96 71 84 128 -+25 42 101 25 42 101 34 50 106 120 125 141 31 31 31 0 0 0 -+0 0 0 0 0 0 96 96 96 71 84 128 38 54 109 118 119 119 -+12 14 18 0 0 0 0 0 0 20 20 21 118 119 119 29 45 103 -+25 42 101 74 87 130 80 80 80 0 1 1 0 0 0 0 0 0 -+44 44 44 120 125 141 45 60 114 45 60 114 134 136 146 31 31 31 -+0 0 0 0 0 0 0 0 0 80 80 80 44 60 114 44 60 114 -+42 58 112 29 46 104 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 101 -+24 41 100 40 56 111 40 56 111 40 56 111 40 56 111 38 54 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 36 52 108 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+71 85 132 70 84 131 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 72 85 132 72 85 132 73 86 133 -+32 50 106 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 100 23 40 100 44 60 114 71 85 132 -+73 86 133 72 85 132 73 86 133 73 86 133 73 86 133 74 87 134 -+74 87 134 73 86 133 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 73 86 134 73 86 134 74 87 134 75 88 134 -+74 87 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 74 87 133 75 88 134 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 88 135 76 88 135 76 88 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 89 135 76 90 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 88 135 76 88 135 76 88 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+75 88 134 76 89 135 76 89 135 75 88 134 74 87 133 74 87 133 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 74 87 134 74 87 134 73 86 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 73 86 133 72 85 132 -+72 85 132 73 86 133 73 86 133 66 80 128 25 42 101 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 80 93 136 118 119 119 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 118 119 119 120 125 141 -+72 85 132 134 136 146 55 55 55 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 20 20 21 132 132 134 74 87 133 -+68 82 130 69 83 131 69 83 131 134 136 146 55 55 55 0 0 0 -+0 0 0 0 0 0 80 80 80 102 109 134 68 82 130 97 107 139 -+118 119 119 0 0 0 0 0 0 0 0 0 20 20 21 118 119 119 -+38 54 109 25 42 101 25 42 101 25 42 101 67 81 125 118 119 119 -+0 0 0 0 0 0 0 0 0 0 0 0 80 80 80 80 80 80 -+80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 -+80 80 80 80 80 80 132 132 134 76 90 135 82 95 139 96 96 96 -+0 1 1 0 0 0 0 0 0 31 31 31 118 119 119 67 81 129 -+102 109 134 80 80 80 0 0 0 0 0 0 0 0 0 20 20 21 -+80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 -+80 80 80 80 80 80 80 80 80 80 80 80 146 146 148 26 43 102 -+29 45 103 74 87 130 137 138 138 118 119 119 96 96 96 80 80 80 -+44 44 44 12 14 18 0 0 0 0 0 0 0 0 0 0 0 0 -+6 7 9 132 132 134 102 109 134 61 75 125 71 84 128 120 125 141 -+132 132 134 118 119 119 96 96 96 66 66 66 31 31 31 5 5 5 -+0 0 0 0 0 0 0 0 0 0 0 0 44 44 44 137 138 138 -+64 79 127 59 74 124 58 73 123 57 72 122 58 73 123 58 73 123 -+58 73 123 57 72 122 27 44 103 24 41 100 80 93 136 66 66 66 -+0 0 0 0 0 0 0 0 0 0 0 0 118 119 119 67 81 125 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 97 107 139 66 66 66 0 1 1 0 0 0 -+0 0 0 44 44 44 132 132 134 56 70 122 55 70 121 55 70 121 -+55 70 121 82 95 139 96 96 96 0 0 0 0 0 0 0 0 0 -+20 20 21 66 66 66 80 80 80 80 80 80 80 80 80 80 80 80 -+80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 141 141 145 -+93 98 116 96 96 96 5 5 5 0 0 0 0 0 0 6 7 9 -+66 66 66 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 -+80 80 80 80 80 80 80 80 80 80 80 80 118 119 119 102 108 129 -+132 132 134 0 0 0 0 0 0 0 0 0 0 0 0 146 146 148 -+74 87 130 50 65 118 50 65 118 132 132 134 66 66 66 0 0 0 -+0 0 0 0 0 0 44 44 44 120 125 141 54 69 120 146 146 148 -+20 20 21 0 0 0 0 0 0 0 0 0 96 96 96 74 87 130 -+25 42 101 25 42 101 36 52 108 120 125 141 31 31 31 0 0 0 -+0 0 0 0 0 0 118 119 119 71 84 128 38 54 109 118 119 119 -+12 14 18 0 0 0 0 0 0 20 20 21 118 119 119 30 46 104 -+25 42 101 74 87 130 80 80 80 0 1 1 0 0 0 0 0 0 -+44 44 44 120 125 141 45 60 114 45 60 114 134 136 146 31 31 31 -+0 0 0 0 0 0 0 0 0 80 80 80 44 60 114 44 60 114 -+40 57 112 27 44 103 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+27 44 102 40 56 111 40 56 111 39 55 111 40 56 111 38 54 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 34 50 107 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+70 84 131 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 70 85 132 71 85 132 72 84 131 72 85 132 -+65 79 128 29 46 103 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 23 39 99 48 64 116 -+73 86 133 73 86 133 72 85 132 73 86 133 72 85 132 73 86 133 -+73 86 133 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 73 86 134 74 87 134 -+75 88 134 74 87 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 74 87 133 75 88 134 -+75 88 134 76 89 135 76 89 135 75 88 134 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 88 135 76 88 135 76 88 135 76 88 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 90 135 -+76 90 135 76 90 135 76 90 135 76 90 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 88 135 -+76 88 135 76 88 135 76 88 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 75 88 134 76 89 135 -+76 89 135 75 88 134 75 88 134 74 87 133 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 74 87 134 75 88 134 74 87 134 73 86 134 73 86 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 73 86 133 74 87 134 73 86 133 72 85 132 73 86 133 -+72 85 132 74 87 133 65 79 128 29 45 103 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 71 84 128 141 141 145 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 12 14 18 132 132 134 82 95 139 -+70 84 131 120 125 141 96 96 96 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 55 55 55 137 138 138 68 82 130 -+69 83 131 69 83 131 69 83 131 134 136 146 55 55 55 0 0 0 -+0 0 0 0 0 0 80 80 80 102 109 134 68 82 130 97 107 139 -+118 119 119 0 0 0 0 0 0 0 0 0 20 20 21 118 119 119 -+36 52 108 25 42 101 25 42 101 25 42 101 55 67 113 146 146 148 -+0 0 0 0 0 0 0 0 0 0 0 0 132 132 134 120 125 141 -+102 109 134 102 109 134 102 109 134 102 109 134 102 109 134 102 109 134 -+102 109 134 102 109 134 120 125 141 73 86 130 82 95 139 96 96 96 -+0 1 1 0 0 0 0 0 0 31 31 31 118 119 119 67 81 129 -+102 109 134 96 96 96 0 0 0 0 0 0 0 0 0 44 44 44 -+137 138 138 102 109 134 102 109 134 102 109 134 102 109 134 102 109 134 -+102 109 134 93 98 116 93 98 116 93 98 116 93 98 116 25 42 101 -+25 42 101 25 42 101 44 58 112 93 98 116 134 136 146 132 132 134 -+141 141 145 141 141 145 118 119 119 31 31 31 0 0 0 0 0 0 -+0 0 0 80 80 80 120 125 141 61 75 125 60 75 125 63 77 126 -+80 93 136 120 125 141 141 141 145 137 138 138 141 141 145 137 138 138 -+96 96 96 6 7 9 0 0 0 0 0 0 5 5 5 118 119 119 -+76 90 135 59 74 124 58 73 123 58 73 123 58 73 123 58 73 123 -+58 73 123 53 68 119 23 39 99 25 42 101 80 93 136 66 66 66 -+0 0 0 0 0 0 0 0 0 0 0 0 118 119 119 71 84 128 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 23 40 100 102 109 134 66 66 66 0 1 1 0 0 0 -+0 0 0 55 55 55 120 125 141 56 70 122 55 70 121 55 70 121 -+55 70 121 74 87 130 118 119 119 6 7 9 0 0 0 0 0 0 -+31 31 31 132 132 134 102 109 134 102 109 134 102 109 134 102 109 134 -+102 108 129 93 98 116 93 98 116 93 98 116 93 98 116 93 98 116 -+67 81 125 118 119 119 6 7 9 0 0 0 0 0 0 6 7 9 -+132 132 134 102 109 134 93 98 116 93 98 116 93 98 116 93 98 116 -+93 98 116 93 98 116 93 98 116 93 98 116 93 98 116 67 81 125 -+146 146 148 0 0 0 0 0 0 0 0 0 0 0 0 118 119 119 -+120 125 141 49 65 117 71 84 128 146 146 148 31 31 31 0 0 0 -+0 0 0 0 0 0 44 44 44 120 125 141 48 64 117 146 146 148 -+44 44 44 0 0 0 0 0 0 0 0 0 66 66 66 120 125 141 -+29 46 103 25 42 101 55 67 113 118 119 119 20 20 21 0 0 0 -+0 0 0 5 5 5 118 119 119 55 67 113 39 56 109 118 119 119 -+12 14 18 0 0 0 0 0 0 20 20 21 118 119 119 30 46 104 -+25 42 101 74 87 130 80 80 80 0 1 1 0 0 0 0 0 0 -+44 44 44 120 125 141 45 60 114 45 60 114 134 136 146 31 31 31 -+0 0 0 0 0 0 0 0 0 80 80 80 44 60 114 44 60 114 -+40 56 111 25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+29 46 103 40 56 111 40 56 111 40 56 111 39 55 111 38 54 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 32 50 106 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+70 84 131 71 85 132 70 84 131 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 70 85 132 71 85 132 71 85 132 71 84 131 -+72 85 132 55 70 121 26 43 102 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+47 63 116 74 87 134 73 86 133 72 85 132 73 86 133 72 85 132 -+73 86 133 74 87 134 73 86 133 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 73 86 134 74 87 134 -+74 87 134 75 88 134 74 87 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 74 87 133 -+74 87 133 75 88 134 75 88 134 76 89 135 76 89 135 75 88 134 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 88 135 76 88 135 -+76 88 135 76 88 135 76 88 135 76 88 135 76 88 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 88 135 76 88 135 -+76 88 135 76 88 135 76 88 135 76 88 135 76 88 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 75 88 134 76 89 135 75 88 134 -+75 88 134 74 87 133 74 87 133 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+74 87 134 75 88 134 74 87 134 73 86 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 73 86 133 -+74 87 134 74 87 134 73 86 133 72 85 132 73 86 133 73 86 133 -+73 86 133 67 80 128 34 50 107 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+33 49 106 74 87 130 146 146 148 20 20 21 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 44 44 44 137 138 138 71 85 132 -+71 85 132 97 107 139 137 138 138 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 80 80 80 120 125 141 69 83 131 -+69 83 131 69 83 131 69 83 131 134 136 146 55 55 55 0 0 0 -+0 0 0 0 0 0 80 80 80 102 109 134 68 82 130 97 107 139 -+118 119 119 0 0 0 0 0 0 0 0 0 31 31 31 120 125 141 -+35 52 107 25 42 101 25 42 101 25 42 101 34 50 106 146 146 148 -+44 44 44 0 0 0 0 0 0 0 0 0 80 80 80 134 136 146 -+73 87 131 67 81 129 120 125 141 141 141 145 141 141 145 137 138 138 -+120 125 141 120 125 141 102 109 134 67 80 128 82 95 139 96 96 96 -+0 1 1 0 0 0 0 0 0 31 31 31 118 119 119 67 81 129 -+80 93 136 118 119 119 20 20 21 0 0 0 0 0 0 20 20 21 -+118 119 119 102 109 134 64 78 127 74 87 130 134 136 146 141 141 145 -+137 138 138 120 125 141 102 109 134 102 108 129 67 81 125 93 98 116 -+141 141 145 141 141 145 137 138 138 137 138 138 137 138 138 132 132 134 -+25 42 101 55 67 113 120 125 141 118 119 119 0 0 0 0 0 0 -+0 0 0 80 80 80 120 125 141 120 125 141 141 141 145 137 138 138 -+137 138 138 137 138 138 141 141 145 102 109 134 62 76 125 97 107 139 -+146 146 148 55 55 55 0 0 0 0 0 0 1 2 4 118 119 119 -+74 87 130 59 74 124 58 73 123 58 73 123 58 73 123 58 73 123 -+59 74 124 40 57 112 23 40 100 25 42 101 80 93 136 66 66 66 -+0 0 0 0 0 0 0 0 0 0 0 0 118 119 119 71 84 128 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 23 40 99 102 109 134 66 66 66 0 1 1 0 0 0 -+0 0 0 66 66 66 120 125 141 55 70 121 55 70 121 55 70 121 -+55 70 121 63 77 126 132 132 134 31 31 31 0 0 0 0 0 0 -+6 7 9 118 119 119 120 125 141 55 70 121 62 76 125 120 125 141 -+141 141 145 141 141 145 132 132 134 120 125 141 102 108 129 93 98 116 -+38 54 109 134 136 146 20 20 21 0 0 0 0 0 0 0 0 0 -+93 98 116 132 132 134 30 48 104 27 43 102 102 109 134 141 141 145 -+141 141 145 132 132 134 120 125 141 102 108 129 74 87 130 49 65 116 -+141 141 145 44 44 44 0 0 0 0 0 0 0 0 0 31 31 31 -+146 146 148 132 132 134 141 141 145 118 119 119 0 0 0 0 0 0 -+0 0 0 0 0 0 44 44 44 120 125 141 48 64 117 120 125 141 -+96 96 96 0 0 0 0 0 0 0 0 0 20 20 21 137 138 138 -+102 108 129 67 81 125 141 141 145 80 80 80 0 0 0 0 0 0 -+0 0 0 31 31 31 132 132 134 33 50 105 39 56 109 118 119 119 -+12 14 18 0 0 0 0 0 0 20 20 21 118 119 119 30 46 104 -+25 42 101 74 87 130 80 80 80 0 1 1 0 0 0 0 0 0 -+44 44 44 120 125 141 45 60 114 45 60 114 134 136 146 31 31 31 -+0 0 0 0 0 0 0 0 0 80 80 80 44 60 114 43 60 114 -+38 54 110 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+32 48 105 40 56 111 40 56 111 40 56 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 38 54 110 39 55 111 31 47 105 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+70 84 131 70 84 131 71 85 132 70 84 131 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 70 85 132 70 85 132 71 85 132 -+72 85 132 72 85 132 44 61 114 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+26 43 101 50 65 118 74 87 133 73 86 133 73 86 133 73 86 133 -+72 85 132 73 86 133 74 87 134 73 86 133 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 73 86 134 -+74 87 134 74 87 134 75 88 134 74 87 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 74 87 133 75 88 134 75 88 134 75 88 134 76 89 135 -+75 88 134 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 88 135 -+76 88 135 76 88 135 76 88 135 76 88 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 75 88 134 76 89 135 76 89 135 75 88 134 75 88 134 -+74 87 133 74 87 133 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 74 87 134 75 88 134 -+75 88 134 74 87 134 73 86 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 73 86 133 74 87 134 -+73 86 133 73 86 133 72 85 132 73 86 133 73 86 133 72 85 132 -+70 84 131 36 52 108 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 25 42 102 -+66 80 128 72 85 132 141 141 145 66 66 66 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 80 80 80 120 125 141 71 85 132 -+70 84 131 76 90 135 146 146 148 31 31 31 0 0 0 0 0 0 -+0 0 0 0 0 0 1 2 4 96 96 96 102 109 134 68 82 130 -+69 83 131 69 83 131 69 83 131 134 136 146 55 55 55 0 0 0 -+0 0 0 0 0 0 80 80 80 102 109 134 68 82 130 97 107 139 -+118 119 119 0 0 0 0 0 0 0 0 0 31 31 31 120 125 141 -+35 52 107 25 42 101 25 42 101 25 42 101 25 42 101 120 125 141 -+118 119 119 0 0 0 0 0 0 0 0 0 12 14 18 118 119 119 -+132 132 134 132 132 134 118 119 119 55 55 55 31 31 31 44 44 44 -+66 66 66 118 119 119 134 136 146 69 82 127 82 95 139 96 96 96 -+0 1 1 0 0 0 0 0 0 31 31 31 118 119 119 68 81 130 -+70 83 130 141 141 145 55 55 55 0 0 1 0 0 0 0 0 0 -+55 55 55 132 132 134 132 132 134 132 132 134 118 119 119 31 31 31 -+31 31 31 55 55 55 66 66 66 141 141 145 102 109 134 93 98 116 -+96 96 96 31 31 31 12 14 18 0 0 0 20 20 21 118 119 119 -+132 132 134 102 109 134 134 136 146 80 80 80 0 0 0 0 0 0 -+0 0 0 118 119 119 102 109 134 132 132 134 80 80 80 20 20 21 -+6 7 9 0 0 0 44 44 44 132 132 134 120 125 141 120 125 141 -+137 138 138 31 31 31 0 0 0 0 0 0 31 31 31 132 132 134 -+69 82 127 58 73 123 57 72 122 58 73 123 58 73 123 57 72 122 -+60 75 125 28 45 103 24 41 100 25 42 101 80 93 136 66 66 66 -+0 0 0 0 0 0 0 0 0 0 0 0 118 119 119 71 84 128 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 27 44 102 102 109 134 66 66 66 0 1 1 0 0 0 -+0 0 0 66 66 66 120 125 141 55 70 121 54 70 120 55 70 121 -+55 70 121 58 73 123 120 125 141 80 80 80 0 0 0 0 0 0 -+0 0 0 44 44 44 118 119 119 132 132 134 132 132 134 118 119 119 -+31 31 31 31 31 31 55 55 55 66 66 66 132 132 134 134 136 146 -+25 42 101 102 109 134 96 96 96 0 0 0 0 0 0 0 0 0 -+20 20 21 118 119 119 132 132 134 132 132 134 132 132 134 44 44 44 -+31 31 31 44 44 44 55 55 55 118 119 119 134 136 146 49 64 117 -+120 125 141 118 119 119 0 0 0 0 0 0 0 0 0 0 0 0 -+31 31 31 80 80 80 66 66 66 0 0 0 31 31 31 5 5 5 -+0 0 0 0 0 0 44 44 44 120 125 141 48 64 116 74 87 130 -+137 138 138 31 31 31 0 0 0 0 0 0 0 0 0 44 44 44 -+118 119 119 118 119 119 80 80 80 6 7 9 0 0 0 0 0 0 -+1 2 4 96 96 96 120 125 141 26 43 101 39 56 109 118 119 119 -+12 14 18 0 0 0 0 0 0 20 20 21 118 119 119 30 46 104 -+25 42 101 74 87 130 80 80 80 0 1 1 0 0 0 0 0 0 -+44 44 44 120 125 141 45 60 114 45 60 114 134 136 146 31 31 31 -+0 0 0 0 0 0 0 0 0 80 80 80 44 60 114 43 59 113 -+35 51 108 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+35 52 107 40 56 111 40 56 111 40 56 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 38 54 110 29 46 104 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+70 84 131 69 83 130 70 84 131 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 70 85 132 -+72 84 131 72 85 132 73 85 132 37 53 109 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 25 42 101 55 69 121 72 85 132 73 86 133 72 85 132 -+73 86 133 73 86 133 73 86 133 74 87 134 74 87 134 73 86 133 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 74 87 133 74 87 133 -+75 88 134 75 88 134 75 88 134 76 89 135 75 88 134 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 75 88 134 76 89 135 76 89 135 -+75 88 134 75 88 134 75 88 134 74 87 133 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 74 87 134 75 88 134 75 88 134 74 87 134 -+73 86 134 73 86 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 73 86 133 74 87 134 73 86 133 -+72 85 132 73 86 133 73 86 133 72 85 132 73 86 133 71 85 132 -+37 53 109 23 40 99 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 101 61 75 125 -+72 85 132 71 84 131 120 125 141 96 96 96 0 0 0 0 0 0 -+0 0 0 0 0 0 5 5 5 118 119 119 97 107 139 71 85 132 -+70 84 131 69 83 130 134 136 146 80 80 80 0 0 0 0 0 0 -+0 0 0 0 0 0 12 14 18 118 119 119 82 95 139 69 83 131 -+69 83 131 69 83 131 69 83 131 134 136 146 55 55 55 0 0 0 -+0 0 0 0 0 0 80 80 80 102 109 134 68 82 130 97 107 139 -+118 119 119 0 0 0 0 0 0 0 0 0 31 31 31 120 125 141 -+35 52 107 25 42 101 25 42 101 25 42 101 25 42 101 49 62 109 -+141 141 145 80 80 80 0 0 0 0 0 0 0 0 0 6 7 9 -+44 44 44 55 55 55 20 20 21 0 0 0 0 0 0 0 0 0 -+44 44 44 132 132 134 97 107 139 65 79 128 82 95 139 96 96 96 -+0 1 1 0 0 0 0 0 0 31 31 31 118 119 119 68 81 130 -+65 79 128 102 109 134 132 132 134 44 44 44 0 0 0 0 0 0 -+0 0 0 20 20 21 55 55 55 44 44 44 5 5 5 0 0 0 -+0 0 0 0 0 0 80 80 80 137 138 138 49 62 109 59 73 120 -+132 132 134 31 31 31 0 0 0 0 0 0 0 0 0 20 20 21 -+66 66 66 80 80 80 55 55 55 2 3 5 0 0 0 0 0 0 -+55 55 55 141 141 145 74 87 130 102 109 134 118 119 119 5 5 5 -+0 0 0 0 0 0 0 0 0 44 44 44 66 66 66 80 80 80 -+31 31 31 0 0 0 0 0 0 0 1 1 96 96 96 134 136 146 -+59 74 124 58 73 123 57 72 122 58 73 123 58 73 123 58 73 123 -+54 69 120 24 41 100 25 42 101 25 42 101 80 93 136 66 66 66 -+0 0 0 0 0 0 0 0 0 0 0 0 118 119 119 71 84 128 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 33 49 106 102 109 134 66 66 66 0 1 1 0 0 0 -+0 0 0 66 66 66 120 125 141 55 70 121 54 70 120 55 70 121 -+55 70 121 55 70 121 80 93 136 141 141 145 55 55 55 0 0 0 -+0 0 0 0 0 0 20 20 21 55 55 55 44 44 44 6 7 9 -+0 0 0 0 0 0 0 0 0 55 55 55 141 141 145 59 73 120 -+25 42 101 55 67 113 146 146 148 66 66 66 0 0 0 0 0 0 -+0 0 0 6 7 9 44 44 44 55 55 55 12 14 18 0 0 0 -+0 0 0 0 0 0 44 44 44 137 138 138 74 87 130 51 66 119 -+69 82 127 146 146 148 44 44 44 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 44 44 44 118 119 119 1 2 4 -+0 0 0 0 0 0 44 44 44 120 125 141 48 64 117 47 63 116 -+102 109 134 118 119 119 20 20 21 0 0 0 0 0 0 0 0 0 -+0 0 0 1 2 4 0 0 0 0 0 0 0 0 0 0 0 0 -+80 80 80 141 141 145 55 67 113 25 42 101 39 56 109 118 119 119 -+12 14 18 0 0 0 0 0 0 20 20 21 118 119 119 30 46 104 -+25 42 101 74 87 130 80 80 80 0 1 1 0 0 0 0 0 0 -+44 44 44 120 125 141 45 60 114 45 60 114 134 136 146 31 31 31 -+0 0 0 0 0 0 0 0 0 80 80 80 44 60 114 43 59 113 -+32 48 107 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+37 53 109 39 55 110 40 56 111 40 56 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 37 53 109 28 45 103 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+70 84 131 69 83 130 70 84 131 71 85 132 70 84 131 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 70 85 132 -+71 85 132 72 84 131 72 85 132 70 84 131 35 52 107 23 40 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 25 42 101 54 69 120 73 87 133 73 86 133 -+72 85 132 73 86 133 72 85 132 73 86 133 73 86 133 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 73 86 134 74 87 134 74 87 134 75 88 134 -+74 87 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+74 87 133 74 87 133 75 88 134 75 88 134 76 89 135 76 89 135 -+76 89 135 75 88 134 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 75 88 134 76 89 135 76 89 135 75 88 134 75 88 134 -+74 87 133 74 87 133 74 87 133 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 74 87 134 75 88 134 74 87 134 74 87 134 73 86 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 73 86 133 74 87 134 73 86 133 72 85 132 -+73 86 133 73 86 133 72 85 132 74 87 133 68 81 130 37 53 109 -+23 40 99 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 25 42 101 53 67 120 72 85 132 -+71 84 131 71 85 132 97 107 139 132 132 134 0 0 0 0 0 0 -+0 0 0 0 0 0 20 20 21 132 132 134 80 93 136 70 84 131 -+69 83 130 70 84 131 102 109 134 132 132 134 0 0 0 0 0 0 -+0 0 0 0 0 0 20 20 21 132 132 134 76 90 135 69 83 131 -+69 83 131 69 83 131 69 83 131 134 136 146 44 44 44 0 0 0 -+0 0 0 0 0 0 80 80 80 102 109 134 68 82 130 97 107 139 -+118 119 119 0 0 0 0 0 0 0 0 0 20 20 21 120 125 141 -+35 52 107 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+67 81 125 141 141 145 96 96 96 20 20 21 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 12 14 18 80 80 80 -+137 138 138 120 125 141 69 82 127 66 80 128 82 95 139 96 96 96 -+0 0 0 0 0 0 0 0 0 31 31 31 118 119 119 67 80 128 -+64 78 127 66 80 127 120 125 141 132 132 134 80 80 80 6 7 9 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+31 31 31 96 96 96 141 141 145 59 73 120 25 42 101 30 46 104 -+102 109 134 132 132 134 55 55 55 5 5 5 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 12 14 18 80 80 80 -+137 138 138 102 109 134 60 75 125 71 84 128 134 136 146 118 119 119 -+44 44 44 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 31 31 31 96 96 96 141 141 145 76 90 135 -+59 74 124 58 73 123 57 72 122 58 73 123 57 72 122 59 74 124 -+42 58 112 24 41 100 25 42 101 25 42 101 82 95 139 66 66 66 -+0 0 0 0 0 0 0 0 0 0 0 0 93 98 116 71 84 128 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 39 55 110 102 109 134 66 66 66 0 0 0 0 0 0 -+0 0 0 55 55 55 120 125 141 55 70 121 54 70 120 55 70 121 -+55 70 121 55 70 121 56 71 121 102 109 134 137 138 138 80 80 80 -+12 14 18 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 20 20 21 96 96 96 141 141 145 71 84 128 25 42 101 -+25 42 101 25 42 101 67 81 125 146 146 148 96 96 96 20 20 21 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+12 14 18 80 80 80 137 138 138 102 108 129 32 48 105 51 66 119 -+50 65 118 102 109 134 132 132 134 55 55 55 0 0 0 0 0 0 -+0 0 0 0 0 0 55 55 55 137 138 138 118 119 119 0 0 0 -+0 0 0 0 0 0 44 44 44 120 125 141 48 64 117 43 59 113 -+38 54 109 120 125 141 132 132 134 66 66 66 6 7 9 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 31 31 31 96 96 96 -+141 141 145 67 81 125 25 42 101 25 42 101 39 56 109 93 98 116 -+2 3 5 0 0 0 0 0 0 6 7 9 118 119 119 30 46 104 -+25 42 101 74 87 130 66 66 66 0 0 0 0 0 0 0 0 0 -+44 44 44 120 125 141 45 60 114 45 60 114 134 136 146 20 20 21 -+0 0 0 0 0 0 0 0 0 80 80 80 44 60 114 43 59 113 -+28 45 103 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 -+38 54 109 39 55 111 39 55 111 40 56 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 37 53 109 27 43 102 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+70 84 131 70 84 131 69 83 130 70 84 131 71 85 132 70 84 131 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+70 85 132 71 85 132 72 84 131 72 85 132 66 80 128 34 50 107 -+23 40 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 25 42 101 49 64 117 74 87 134 -+73 86 133 72 85 132 73 86 133 72 85 132 73 86 133 74 87 134 -+73 86 133 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 73 86 134 73 86 134 74 87 134 -+75 88 134 75 88 134 74 87 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 74 87 133 74 87 133 75 88 134 75 88 134 -+75 88 134 76 89 135 76 89 135 76 89 135 75 88 134 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 75 88 134 75 88 134 75 88 134 74 87 133 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 74 87 134 73 86 134 73 86 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 73 86 133 74 87 134 73 86 133 72 85 132 73 86 133 -+73 86 133 72 85 132 73 86 133 66 80 128 36 52 108 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 100 47 63 116 71 84 131 72 85 132 -+71 85 132 71 85 132 77 90 136 146 146 148 137 138 138 137 138 138 -+137 138 138 137 138 138 137 138 138 134 136 146 74 88 133 69 83 130 -+70 84 131 70 84 131 80 93 136 146 146 148 137 138 138 137 138 138 -+137 138 138 137 138 138 137 138 138 120 125 141 74 87 133 69 83 131 -+69 83 131 69 83 131 69 83 131 141 141 145 137 138 138 137 138 138 -+137 138 138 137 138 138 141 141 145 102 109 134 68 82 130 97 107 139 -+146 146 148 137 138 138 137 138 138 137 138 138 137 138 138 120 125 141 -+35 52 107 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 55 67 113 132 132 134 137 138 138 132 132 134 96 96 96 -+96 96 96 96 96 96 96 96 96 132 132 134 137 138 138 141 141 145 -+97 107 139 66 80 128 65 79 128 66 80 128 80 93 136 141 141 145 -+137 138 138 137 138 138 137 138 138 137 138 138 134 136 146 68 81 130 -+64 78 127 63 77 126 65 79 128 102 109 134 141 141 145 137 138 138 -+118 119 119 96 96 96 96 96 96 96 96 96 118 119 119 132 132 134 -+141 141 145 120 125 141 49 62 109 25 42 101 25 42 101 25 42 101 -+27 44 102 93 98 116 141 141 145 137 138 138 118 119 119 96 96 96 -+80 80 80 96 96 96 96 96 96 118 119 119 137 138 138 134 136 146 -+97 107 139 62 76 125 60 75 125 59 75 125 71 84 128 120 125 141 -+141 141 145 132 132 134 118 119 119 96 96 96 80 80 80 96 96 96 -+118 119 119 132 132 134 141 141 145 120 125 141 74 87 130 59 74 124 -+58 73 123 58 73 123 57 72 122 58 73 123 58 73 123 59 74 124 -+32 50 106 24 41 100 25 42 101 25 42 101 74 87 130 141 141 145 -+137 138 138 137 138 138 137 138 138 137 138 138 141 141 145 67 81 125 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+26 43 101 45 60 114 102 109 134 141 141 145 137 138 138 137 138 138 -+137 138 138 141 141 145 120 125 141 54 70 120 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 80 93 136 134 136 146 -+137 138 138 118 119 119 96 96 96 96 96 96 96 96 96 118 119 119 -+132 132 134 137 138 138 132 132 134 58 72 120 26 43 102 25 42 101 -+25 42 101 25 42 101 25 42 101 49 62 109 120 125 141 141 141 145 -+132 132 134 96 96 96 96 96 96 96 96 96 96 96 96 132 132 134 -+137 138 138 132 132 134 67 81 125 25 42 101 38 54 110 51 66 119 -+50 65 118 52 66 118 102 109 134 141 141 145 118 119 119 96 96 96 -+96 96 96 132 132 134 141 141 145 120 125 141 146 146 148 137 138 138 -+137 138 138 137 138 138 137 138 138 102 109 134 48 64 117 39 55 110 -+25 42 101 30 48 104 93 98 116 141 141 145 137 138 138 118 119 119 -+96 96 96 96 96 96 93 98 116 132 132 134 141 141 145 120 125 141 -+49 62 109 25 42 101 25 42 101 25 42 101 39 56 109 141 141 145 -+137 138 138 137 138 138 137 138 138 137 138 138 141 141 145 30 46 104 -+25 42 101 67 81 125 141 141 145 137 138 138 137 138 138 137 138 138 -+137 138 138 120 125 141 45 60 114 45 60 114 120 125 141 137 138 138 -+137 138 138 137 138 138 137 138 138 141 141 145 43 59 113 43 59 113 -+25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 27 44 103 -+38 56 110 40 56 111 40 56 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 36 52 108 25 42 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+70 84 131 70 84 131 70 84 131 69 83 130 70 84 131 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+70 85 132 70 85 132 71 85 132 72 84 131 72 85 132 62 76 125 -+30 46 104 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 46 61 115 -+73 86 133 73 86 133 73 86 133 73 86 133 72 85 132 73 86 133 -+74 87 134 74 87 134 73 86 133 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 73 86 134 -+74 87 134 74 87 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 74 87 133 74 87 133 -+75 88 134 75 88 134 75 88 134 75 88 134 76 89 135 76 89 135 -+76 89 135 75 88 134 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+75 88 134 76 89 135 76 89 135 76 89 135 75 88 134 75 88 134 -+75 88 134 75 88 134 74 87 133 74 87 133 74 87 133 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 74 87 134 75 88 134 -+74 87 134 74 87 134 74 87 134 73 86 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 73 86 133 72 85 132 73 86 133 73 86 133 -+72 85 132 73 86 133 68 82 130 33 49 106 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 40 56 111 72 85 132 72 85 132 72 84 131 -+71 85 132 70 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 70 84 131 71 85 132 70 84 131 69 83 130 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 69 83 131 68 82 130 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 68 82 130 68 82 130 67 81 129 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 67 81 129 -+64 78 127 30 46 104 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 23 40 100 53 67 120 65 79 128 65 79 128 66 80 128 -+66 80 129 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 65 79 128 64 78 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 64 78 127 65 79 128 -+63 77 126 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 62 76 125 64 78 127 38 56 110 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 27 44 102 55 69 121 61 75 125 61 75 125 61 75 125 -+61 75 125 60 75 125 60 75 125 59 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 58 73 123 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+58 73 123 57 72 122 58 73 123 58 73 123 58 73 123 53 68 119 -+28 45 103 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+28 45 103 51 66 119 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 55 70 121 54 70 120 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 53 68 119 -+54 69 120 54 69 120 54 69 120 54 69 120 55 69 121 38 54 110 -+23 40 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 23 40 99 45 60 114 51 66 119 -+49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 49 65 117 48 65 116 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 48 64 116 48 64 117 36 52 108 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 27 44 103 43 58 114 46 61 115 44 59 113 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 -+45 60 114 43 60 114 44 60 114 44 60 114 44 60 114 40 56 111 -+23 40 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 29 46 104 -+39 55 110 40 56 111 40 56 111 39 55 111 38 54 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 35 51 108 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 71 85 132 -+71 85 132 70 84 131 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 70 85 132 71 85 132 72 84 131 73 86 133 -+58 73 123 27 44 102 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 40 99 -+47 63 116 71 84 131 73 86 133 72 85 132 73 86 133 73 86 133 -+72 85 132 73 86 133 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 73 86 134 73 86 134 74 87 134 74 87 134 75 88 134 -+75 88 134 74 87 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 74 87 133 74 87 133 74 87 133 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 76 89 135 -+76 89 135 76 89 135 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 74 87 133 74 87 133 74 87 133 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 74 87 134 75 88 134 74 87 134 74 87 134 73 86 134 -+73 86 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 73 86 133 74 87 134 -+73 86 133 72 85 132 72 85 132 73 86 133 72 85 132 73 86 133 -+73 86 133 66 80 128 29 46 104 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 37 53 109 73 86 133 72 85 132 72 84 131 70 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 70 84 131 71 85 132 70 84 131 69 83 130 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 69 83 131 70 84 131 -+70 84 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 68 82 130 69 83 131 67 81 129 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 81 130 68 82 130 -+44 61 114 23 40 99 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 35 51 108 63 77 126 66 80 129 66 80 128 66 80 129 -+66 80 128 66 80 127 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 64 78 127 65 79 128 63 77 126 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 63 77 126 63 77 126 58 73 123 30 46 104 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 36 52 108 58 73 123 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 59 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 58 73 123 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 -+58 73 123 57 72 122 58 73 123 58 73 123 58 73 123 44 61 114 -+25 43 102 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+31 47 105 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 55 70 121 55 70 121 54 70 120 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 54 69 120 53 68 119 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 55 70 121 29 46 104 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 26 43 102 47 63 116 50 65 118 -+49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+49 65 117 49 65 117 48 65 116 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 48 64 117 47 63 116 32 48 105 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 29 46 104 45 60 114 46 61 115 44 59 113 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 36 52 108 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 32 48 105 -+39 55 110 40 56 111 40 56 111 39 55 111 38 54 111 39 55 111 -+39 55 111 39 55 111 39 55 111 38 54 110 33 49 106 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+70 84 131 70 84 131 70 84 131 70 84 131 69 83 130 70 84 131 -+70 84 131 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 70 85 132 71 85 132 71 84 131 -+74 87 133 56 71 121 27 44 103 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+23 39 99 42 57 112 68 81 130 74 87 134 72 85 132 72 85 132 -+73 86 133 72 85 132 73 86 133 74 87 134 74 87 134 73 86 133 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 73 86 134 74 87 134 74 87 134 -+74 87 134 75 88 134 74 87 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+74 87 133 74 87 133 74 87 133 74 87 133 74 87 133 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 74 87 133 74 87 133 74 87 133 -+74 87 133 74 87 133 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 74 87 134 -+75 88 134 75 88 134 74 87 134 74 87 134 73 86 134 73 86 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 73 86 133 74 87 134 74 87 134 73 86 133 -+72 85 132 73 86 133 73 86 133 73 86 133 73 86 133 73 86 133 -+58 73 123 27 44 102 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+39 55 110 71 84 131 72 85 132 71 84 131 71 85 132 70 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+70 84 131 71 85 132 70 84 131 69 83 130 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 69 83 131 -+69 83 131 68 82 130 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 68 82 130 69 83 131 68 82 130 67 81 129 68 82 130 -+68 82 130 68 82 130 68 82 130 67 81 129 68 82 130 60 75 125 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 50 65 118 67 80 128 65 79 128 66 80 129 66 80 128 -+66 80 128 66 80 127 66 80 128 66 80 128 66 80 128 66 80 128 -+65 79 128 66 80 128 65 79 128 64 78 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 63 77 126 -+64 78 127 62 76 125 63 77 126 48 63 117 25 42 101 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 46 61 115 61 75 125 60 75 125 61 75 125 61 75 125 -+60 75 125 61 75 125 59 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 59 74 124 60 75 125 58 73 123 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 -+57 72 122 58 73 123 58 73 123 58 73 123 57 72 122 38 54 110 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+39 55 111 57 72 122 55 69 121 56 70 122 56 70 122 56 70 122 -+56 70 122 55 70 121 54 70 120 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 54 69 120 53 68 119 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 51 66 119 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 31 47 105 49 64 117 50 65 118 -+49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 49 65 117 48 65 116 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 48 63 117 46 61 115 29 45 103 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 32 48 107 47 63 116 45 60 114 44 59 113 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 31 47 105 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 34 50 107 -+40 56 111 40 56 111 40 56 111 39 55 111 38 54 111 39 55 111 -+39 55 111 39 55 111 39 55 111 38 54 110 31 47 105 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 69 83 130 -+70 84 131 71 85 132 70 84 131 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 70 85 132 71 85 132 -+71 84 131 73 86 133 58 73 123 28 45 102 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 23 40 99 34 50 107 62 76 125 74 87 134 73 86 133 -+73 86 133 73 86 133 72 85 132 73 86 133 73 86 133 74 87 134 -+73 86 133 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 73 86 134 73 86 134 -+74 87 134 74 87 134 75 88 134 75 88 134 74 87 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 74 87 133 -+74 87 133 74 87 133 74 87 133 74 87 133 74 87 133 74 87 133 -+74 87 133 74 87 133 74 87 133 74 87 133 74 87 133 74 87 133 -+74 87 133 74 87 133 74 87 133 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+74 87 134 74 87 134 73 86 134 73 86 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 73 86 133 73 86 133 72 85 132 -+73 86 133 73 86 133 72 85 132 73 86 133 73 86 133 50 65 118 -+27 43 102 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 39 55 110 -+68 82 130 72 85 132 72 84 131 71 85 132 70 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 70 84 131 69 83 130 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 69 83 131 -+68 82 130 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 68 82 130 67 81 129 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 32 50 106 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+33 49 106 65 79 128 66 80 129 65 79 128 66 80 129 66 80 128 -+66 80 127 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 65 79 128 65 79 128 64 78 128 65 79 128 65 79 128 -+65 79 128 65 79 128 64 78 127 65 79 128 64 78 127 63 77 126 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+63 77 126 63 77 126 61 75 125 36 52 108 24 41 100 25 42 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+29 45 103 56 71 121 61 75 125 59 74 124 61 75 125 61 75 125 -+61 75 125 60 75 125 59 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 59 74 124 58 73 123 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 59 74 124 -+57 72 122 58 73 123 58 73 123 58 73 123 54 69 120 29 47 104 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+50 65 118 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+55 70 121 56 70 122 54 70 120 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 54 69 120 55 70 121 53 68 119 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 43 59 113 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 36 52 108 50 65 118 49 64 117 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 48 64 117 43 59 113 25 42 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 37 53 109 46 61 115 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+44 60 114 44 60 114 44 60 114 43 59 113 44 61 114 26 43 102 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 36 52 108 -+40 56 111 39 55 111 40 56 111 39 55 111 38 54 111 39 55 111 -+39 55 111 39 55 111 39 55 111 38 54 110 27 44 103 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+69 83 130 70 84 131 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 70 85 132 70 85 132 -+71 85 132 72 84 131 72 85 132 58 73 123 28 45 103 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 28 45 103 58 73 123 73 86 133 -+72 85 132 73 86 133 73 86 133 72 85 132 72 85 132 73 86 133 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+73 86 134 73 86 134 74 87 134 74 87 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 74 87 134 75 88 134 74 87 134 74 87 134 -+74 87 134 73 86 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+73 86 133 74 87 134 73 86 133 72 85 132 72 85 132 72 85 132 -+73 86 133 72 85 132 73 86 133 73 86 133 40 57 112 24 41 100 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 36 52 108 70 84 131 -+72 85 132 71 85 132 71 85 132 70 85 132 70 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 70 84 131 -+71 85 132 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 69 83 131 69 83 131 68 82 130 -+68 82 130 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+68 82 130 69 83 131 68 82 130 67 81 129 68 82 130 68 82 130 -+68 82 130 68 82 130 67 81 129 70 84 131 47 63 116 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+55 69 121 67 80 128 65 79 128 66 80 128 66 80 128 66 80 127 -+66 80 127 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 65 79 128 64 78 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 64 78 127 63 77 126 63 77 126 -+64 78 127 64 78 127 64 78 127 64 78 127 63 77 126 64 78 127 -+63 77 126 63 77 126 56 71 121 25 42 101 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+36 52 108 62 76 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 59 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 58 73 123 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 -+57 72 122 58 73 123 58 73 123 57 72 122 50 65 118 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 28 45 103 -+57 72 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 55 70 121 54 70 120 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 54 69 120 53 68 119 54 69 120 -+54 69 120 54 69 120 53 68 119 55 70 121 34 50 106 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 25 42 101 40 57 112 51 66 119 49 64 117 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 48 64 117 49 65 117 47 63 116 40 56 111 23 40 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 40 57 112 46 61 115 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 45 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 42 58 112 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 26 43 102 37 53 109 -+40 56 111 40 56 111 39 55 111 38 54 111 38 54 111 39 55 111 -+39 55 111 39 55 111 38 54 111 38 54 110 25 42 101 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 69 83 130 70 84 131 71 85 132 70 84 131 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+70 85 132 71 85 132 71 84 131 73 86 133 57 72 122 28 45 103 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 23 40 99 51 66 119 -+71 85 132 73 86 133 73 86 133 72 85 132 73 86 133 72 85 132 -+72 85 132 73 86 133 74 87 134 74 87 134 73 86 133 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 73 86 134 73 86 134 74 87 134 -+74 87 134 74 87 134 75 88 134 75 88 134 74 87 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 74 87 134 75 88 134 75 88 134 -+74 87 134 74 87 134 74 87 134 73 86 134 73 86 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 72 85 132 72 85 132 73 86 133 73 86 133 72 85 132 -+73 86 133 73 86 133 66 80 128 31 47 105 23 40 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 37 53 109 73 85 132 72 85 132 -+72 84 131 71 85 132 70 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+70 84 131 69 83 130 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 69 83 131 70 84 131 69 83 131 68 82 130 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 68 82 130 -+69 83 131 68 82 130 67 81 129 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 60 75 125 29 46 104 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 36 52 108 -+68 82 130 65 79 128 66 80 128 66 80 129 66 80 127 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 65 79 128 -+65 79 128 64 78 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 64 78 127 63 77 126 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 63 77 126 -+62 76 125 63 77 126 40 57 112 23 40 99 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+51 66 119 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 58 73 123 59 74 124 57 72 122 -+58 73 123 58 73 123 57 72 122 57 72 122 39 55 110 23 40 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 39 55 110 -+57 72 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 53 68 119 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 53 67 120 29 45 103 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 27 44 102 44 60 115 51 66 119 49 64 117 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+49 65 117 48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 48 64 117 47 63 116 34 50 107 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 25 42 101 46 61 115 46 61 115 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 -+43 60 114 44 60 114 44 60 114 44 60 114 39 55 110 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 27 44 102 39 55 110 -+40 56 111 40 56 111 39 55 111 38 54 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 37 53 109 23 40 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+70 84 131 69 83 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 69 83 130 70 84 131 71 85 132 70 84 131 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 70 85 132 71 85 132 71 84 131 74 87 133 59 74 124 -+31 47 105 23 40 99 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 101 23 39 99 -+38 56 110 64 78 127 73 86 133 73 86 133 73 86 133 73 86 133 -+73 86 133 72 85 132 73 86 133 73 86 133 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 73 86 134 -+73 86 134 74 87 134 74 87 134 74 87 134 75 88 134 75 88 134 -+75 88 134 74 87 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 74 87 134 75 88 134 75 88 134 74 87 134 74 87 134 -+74 87 134 73 86 134 73 86 134 73 86 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 73 86 133 73 86 133 73 86 133 -+73 86 133 72 85 132 73 86 133 73 86 133 72 85 132 73 86 133 -+72 85 132 54 69 120 27 44 102 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 25 42 101 42 58 112 72 85 132 72 85 132 72 84 131 -+71 85 132 70 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 70 84 131 70 84 131 70 84 131 -+69 83 130 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 69 83 131 68 82 130 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+68 82 130 67 81 129 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 67 81 129 67 81 129 40 57 112 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 61 75 125 -+66 80 129 66 80 129 66 80 129 66 80 128 66 80 127 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+65 79 128 64 78 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 64 78 127 64 78 127 63 77 126 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 63 77 126 -+63 77 126 59 74 124 25 42 101 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 29 46 104 -+62 76 125 61 75 125 61 75 125 61 75 125 60 75 125 61 75 125 -+60 75 125 59 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 59 74 124 58 73 123 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 57 72 122 -+58 73 123 58 73 123 58 73 123 57 72 122 27 44 103 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 23 40 99 50 65 118 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 55 70 121 -+56 70 122 54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 54 69 120 55 70 121 53 68 119 54 69 120 54 69 120 -+54 69 120 53 68 119 54 69 120 46 61 115 27 43 102 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 29 46 104 49 64 117 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 48 64 116 47 63 116 29 45 103 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 29 45 103 47 63 116 45 60 114 44 59 113 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 -+43 60 114 44 60 114 44 60 114 44 60 114 34 50 107 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 29 46 103 40 56 111 -+40 56 111 40 56 111 39 55 111 38 54 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 34 50 107 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+69 83 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 69 83 130 70 84 131 70 84 131 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 70 85 132 71 85 132 71 84 131 73 86 133 -+63 77 126 35 52 107 23 40 99 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 30 46 104 52 67 118 74 87 134 73 86 133 72 85 132 -+73 86 133 73 86 133 72 85 132 73 86 133 73 86 133 74 87 134 -+73 86 133 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 73 86 134 73 86 134 73 86 134 74 87 134 74 87 134 -+74 87 134 75 88 134 75 88 134 75 88 134 74 87 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 74 87 134 74 87 134 74 87 134 73 86 134 -+73 86 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 73 86 133 74 87 134 74 87 134 73 86 133 72 85 132 -+72 85 132 73 86 133 72 85 132 72 85 132 75 88 134 68 81 130 -+40 56 111 25 42 101 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 47 63 116 71 84 131 72 85 132 72 84 131 71 85 132 -+71 85 132 70 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 70 84 131 71 85 132 70 84 131 69 83 130 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+69 83 131 70 84 131 69 83 131 68 82 130 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 68 82 130 69 83 131 -+67 81 129 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+67 81 129 68 82 130 55 70 121 25 42 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 23 40 99 46 61 115 66 80 129 -+65 79 128 66 80 128 66 80 129 66 80 127 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 65 79 128 66 80 128 -+64 78 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 64 78 127 63 77 126 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 63 77 126 63 77 126 -+64 78 127 42 58 112 23 40 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 23 40 99 47 63 116 -+61 75 125 59 74 124 61 75 125 61 75 125 61 75 125 60 75 125 -+60 75 125 59 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+59 74 124 60 75 125 59 74 124 58 73 123 59 74 124 59 74 124 -+59 74 124 59 74 124 58 73 123 59 74 124 58 73 123 58 73 123 -+58 73 123 58 73 123 58 73 123 49 65 117 23 40 99 25 42 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 29 46 104 56 70 122 -+55 69 121 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+55 70 121 54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 54 69 120 53 68 119 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 40 56 111 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 33 49 106 52 67 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+48 64 117 49 65 117 48 64 117 47 63 116 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 34 50 107 46 61 115 45 60 114 44 59 113 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 -+43 60 114 44 60 114 43 59 113 44 61 114 29 46 104 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 31 47 105 40 56 111 -+39 55 110 40 56 111 39 55 111 38 54 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 31 47 105 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+69 83 131 70 84 131 69 83 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 69 83 130 69 83 130 70 84 131 -+70 84 131 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 70 85 132 70 85 132 71 85 132 72 84 131 -+72 85 132 67 81 129 37 53 109 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 25 42 101 37 53 109 69 83 131 74 87 133 -+72 85 132 72 85 132 73 86 133 72 85 132 72 85 132 73 86 133 -+74 87 134 74 87 134 73 86 133 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 73 86 134 73 86 134 -+74 87 134 74 87 134 74 87 134 74 87 134 75 88 134 75 88 134 -+75 88 134 75 88 134 74 87 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 74 87 134 74 87 134 -+74 87 134 74 87 134 73 86 134 73 86 134 73 86 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 73 86 133 73 86 133 72 85 132 73 86 133 -+73 86 133 73 86 133 73 86 133 74 87 134 55 69 121 28 45 103 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 23 40 100 -+54 69 120 72 85 132 72 85 132 72 85 132 71 85 132 71 85 132 -+70 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 70 84 131 71 85 132 70 84 131 69 83 130 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 69 83 131 68 82 130 68 82 130 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 68 82 130 69 83 131 68 82 130 -+67 81 129 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 67 80 128 27 44 103 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 32 50 106 61 75 125 66 80 129 -+66 80 129 66 80 129 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 65 79 128 -+64 78 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+64 78 127 65 79 128 63 77 126 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 63 77 126 63 77 126 63 77 126 -+60 75 125 25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 27 44 102 59 74 124 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 60 75 125 -+59 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 59 74 124 58 73 123 58 73 123 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 58 73 123 57 72 122 58 73 123 -+58 73 123 57 72 122 59 74 124 34 50 107 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 23 40 100 39 55 111 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 52 67 118 34 50 107 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 40 56 111 51 66 119 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 50 65 118 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 48 64 117 48 64 117 40 57 112 23 40 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+23 40 100 40 57 112 46 61 115 45 60 114 44 59 113 45 60 114 -+45 60 114 45 60 114 45 60 114 44 60 114 45 60 114 44 60 114 -+43 60 114 44 60 114 44 60 114 43 59 113 27 44 102 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 34 50 107 40 56 111 -+40 56 111 39 55 111 38 54 111 38 54 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 27 44 102 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+68 82 130 69 83 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 69 83 130 -+70 84 131 71 85 132 70 84 131 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 70 85 132 71 85 132 -+72 84 131 72 85 132 72 85 132 39 55 111 25 42 101 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 55 70 121 -+71 85 132 73 86 133 73 86 133 72 85 132 73 86 133 73 86 133 -+72 85 132 73 86 133 73 86 133 74 87 134 74 87 134 73 86 133 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 73 86 134 73 86 134 73 86 134 -+73 86 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 75 88 134 75 88 134 75 88 134 -+75 88 134 75 88 134 75 88 134 75 88 134 75 88 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 73 86 134 73 86 134 73 86 134 73 86 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 73 86 133 74 87 134 74 87 134 73 86 133 -+73 86 133 72 85 132 72 85 132 73 86 133 72 85 132 72 85 132 -+73 86 133 72 85 132 68 81 130 40 57 112 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 27 44 102 59 74 124 -+73 86 133 71 84 131 72 85 132 70 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 70 84 131 69 83 130 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 69 83 131 70 84 131 -+69 83 131 68 82 130 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 68 82 130 67 81 129 -+68 82 130 68 82 130 68 82 130 68 82 130 67 81 129 68 82 130 -+69 83 130 38 54 109 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 49 64 117 66 80 129 66 80 128 -+66 80 129 66 80 129 66 80 128 66 80 127 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 64 78 127 -+65 79 128 63 77 126 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 63 77 126 64 78 127 62 76 125 64 78 127 -+42 58 112 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 23 40 100 43 59 113 59 74 124 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 60 75 125 -+59 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 59 74 124 58 73 123 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 58 73 123 57 72 122 58 73 123 -+58 73 123 58 73 123 55 70 121 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 49 64 117 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 50 65 118 29 45 103 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 25 42 101 47 63 116 50 65 118 49 64 117 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 -+48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 48 64 116 48 64 117 32 48 107 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+25 42 100 44 60 115 46 61 115 45 60 114 44 59 113 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 43 60 114 -+44 60 114 44 60 114 44 60 114 40 56 111 26 43 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 37 53 109 40 56 111 -+40 56 111 39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 25 42 100 24 41 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+69 83 131 68 82 130 69 83 131 70 84 131 69 83 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+69 83 130 70 84 131 71 85 132 70 84 131 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 70 85 132 -+71 85 132 72 84 131 72 85 132 73 86 133 49 64 117 27 44 103 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 23 40 100 -+39 55 111 61 75 125 73 86 133 73 86 133 73 86 133 72 85 132 -+73 86 133 72 85 132 72 85 132 73 86 133 73 86 133 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 73 86 134 73 86 134 73 86 134 73 86 134 73 86 134 -+73 86 134 73 86 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+73 86 134 73 86 134 73 86 134 73 86 134 73 86 134 73 86 134 -+73 86 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+73 86 133 74 87 134 74 87 134 73 86 133 73 86 133 72 85 132 -+72 85 132 73 86 133 73 86 133 73 86 133 73 86 133 74 87 134 -+68 82 130 53 67 120 29 46 104 23 39 99 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 35 52 107 64 78 127 72 85 132 -+71 84 131 71 85 132 71 85 132 70 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 70 84 131 -+70 84 131 70 84 131 69 83 130 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 69 83 131 70 84 131 69 83 131 -+68 82 130 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 68 82 130 67 81 129 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 69 83 130 -+50 65 118 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 34 50 107 65 79 128 66 80 129 65 79 128 -+66 80 128 66 80 128 66 80 127 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 65 79 128 66 80 128 65 79 128 64 78 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 63 77 126 63 77 126 58 73 123 -+29 47 104 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 26 43 102 55 69 121 61 75 125 -+61 75 125 61 75 125 61 75 125 60 75 125 60 75 125 59 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+59 74 124 58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 58 73 123 58 73 123 57 72 122 58 73 123 -+57 72 122 59 74 124 42 58 112 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 31 47 105 53 67 120 55 69 121 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 55 70 121 -+54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 54 69 120 53 68 119 54 69 120 54 69 120 54 69 120 -+54 69 120 53 68 119 46 61 115 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 28 45 103 52 67 118 50 65 118 49 64 117 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 -+48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 -+49 65 117 48 64 117 48 64 117 26 43 102 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+29 46 104 46 61 115 45 60 114 44 59 113 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 43 60 114 -+44 60 114 43 59 113 44 60 114 36 52 108 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 25 42 101 40 56 111 40 56 111 -+40 56 111 39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 36 52 108 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+69 83 131 69 83 131 68 82 130 69 83 131 70 84 131 69 83 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+69 83 130 70 84 131 70 84 131 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+70 85 132 71 85 132 72 84 131 72 85 132 72 85 132 58 73 123 -+31 47 105 23 40 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+23 40 99 27 44 103 42 58 112 64 78 127 74 87 134 73 86 133 -+72 85 132 73 86 133 73 86 133 72 85 132 72 85 132 73 86 133 -+73 86 133 74 87 134 74 87 134 73 86 133 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 73 86 134 73 86 134 73 86 134 73 86 134 -+73 86 134 73 86 134 73 86 134 73 86 134 73 86 134 73 86 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 73 86 133 74 87 134 -+74 87 134 73 86 133 73 86 133 73 86 133 72 85 132 72 85 132 -+73 86 133 73 86 133 72 85 132 73 86 133 74 87 134 55 69 121 -+35 52 107 24 40 99 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 23 39 99 44 59 113 67 81 129 72 85 132 72 85 132 -+71 85 132 71 85 132 70 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 70 84 131 71 85 132 -+70 84 131 69 83 130 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 69 83 131 70 84 131 69 83 131 68 82 130 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 68 82 130 68 82 130 68 82 130 67 81 129 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 59 74 124 -+29 45 103 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 59 74 124 66 80 129 65 79 128 66 80 128 -+66 80 128 66 80 127 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 65 79 128 65 79 128 64 78 128 -+65 79 128 65 79 128 65 79 128 65 79 128 64 78 127 65 79 128 -+64 78 127 63 77 126 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 63 77 126 64 78 127 62 76 125 63 77 126 46 61 115 -+25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 37 53 109 59 74 124 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 60 75 125 59 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 -+59 74 124 58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 58 73 123 57 72 122 58 73 123 58 73 123 -+58 73 123 57 72 122 31 47 105 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 38 54 110 55 69 121 56 70 122 -+56 70 122 56 70 122 56 70 122 55 70 121 56 70 122 55 70 121 -+54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 -+55 70 121 54 69 120 53 68 119 54 69 120 54 69 120 54 69 120 -+54 69 120 53 68 119 37 53 109 23 40 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 37 53 109 52 67 118 50 65 118 49 64 117 50 65 118 -+50 65 118 50 65 118 50 65 118 49 65 117 50 65 118 49 65 117 -+48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+48 64 117 48 64 117 44 60 114 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+35 51 108 46 61 115 45 60 114 44 59 113 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 43 60 114 -+44 60 114 44 60 114 44 60 114 34 50 106 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 28 45 103 40 56 111 39 55 110 -+39 55 111 40 56 111 38 54 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 33 49 106 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+69 83 131 69 83 131 69 83 131 68 82 130 69 83 131 70 84 131 -+69 83 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 69 83 130 69 83 130 70 84 131 70 84 131 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+70 85 132 71 85 132 71 85 132 71 85 132 72 85 132 72 85 132 -+68 81 130 37 53 109 23 40 99 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 27 44 102 46 61 115 71 85 132 -+73 86 133 72 85 132 72 85 132 73 86 133 72 85 132 72 85 132 -+72 85 132 73 86 133 73 86 133 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 73 86 133 74 87 134 74 87 134 73 86 133 -+73 86 133 72 85 132 72 85 132 72 85 132 73 86 133 73 86 133 -+72 85 132 73 86 133 75 88 134 61 75 125 34 50 107 25 42 101 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+25 42 101 56 71 121 71 84 131 72 85 132 72 84 131 72 84 131 -+71 85 132 70 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 70 84 131 71 85 132 70 84 131 -+69 83 130 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 69 83 131 68 82 130 68 82 130 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+68 82 130 69 83 131 68 82 130 67 81 129 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 67 81 129 65 79 128 37 53 109 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+23 39 99 47 63 116 67 80 128 66 80 129 66 80 129 66 80 129 -+66 80 128 66 80 127 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 65 79 128 64 78 128 64 78 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 64 78 127 -+63 77 126 63 77 126 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 63 77 126 62 76 125 59 74 124 33 49 106 -+24 41 100 25 42 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 26 43 102 48 63 117 61 75 125 61 75 125 -+61 75 125 61 75 125 60 75 125 61 75 125 59 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+59 74 124 58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 58 73 123 57 72 122 58 73 123 57 72 122 -+58 73 123 49 65 117 27 44 102 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 26 43 102 46 61 115 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 55 70 121 54 70 120 -+54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+54 69 120 53 68 119 53 68 119 54 69 120 54 69 120 54 69 120 -+53 68 119 53 68 119 27 44 103 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+23 40 99 46 61 115 51 66 119 49 64 117 49 64 117 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 48 65 116 -+48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+48 64 117 48 64 117 37 53 109 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 23 40 100 -+40 56 111 46 61 115 45 60 114 44 59 113 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 44 60 114 43 60 114 43 60 114 -+44 60 114 44 60 114 43 59 113 29 47 104 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 32 50 106 40 56 111 40 56 111 -+40 56 111 39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 29 46 104 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+69 83 131 69 83 131 69 83 131 69 83 131 68 82 130 69 83 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 69 83 130 70 84 131 71 85 132 -+70 84 131 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 70 85 132 71 85 132 72 84 131 -+72 85 132 74 87 133 49 64 117 26 43 101 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 23 40 100 26 43 101 -+51 66 119 70 84 131 72 85 132 73 86 133 73 86 133 72 85 132 -+73 86 133 73 86 133 72 85 132 72 85 132 72 85 132 73 86 133 -+73 86 133 73 86 133 74 87 134 74 87 134 73 86 133 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 73 86 133 74 87 134 74 87 134 -+73 86 133 73 86 133 73 86 133 72 85 132 72 85 132 72 85 132 -+73 86 133 73 86 133 72 85 132 72 85 132 73 86 133 73 86 133 -+71 85 132 64 78 127 38 54 110 23 40 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 33 49 106 -+64 78 127 72 85 132 71 84 131 72 85 132 71 85 132 70 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 70 84 131 69 83 130 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 69 83 131 70 84 131 69 83 131 68 82 130 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 67 81 129 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 81 130 68 82 130 68 82 130 48 64 117 23 40 99 -+24 41 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+34 50 107 66 80 129 65 79 128 66 80 128 66 80 129 66 80 128 -+66 80 127 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 65 79 128 64 78 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 64 78 127 -+63 77 126 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 63 77 126 63 77 126 50 65 118 23 40 99 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 31 47 105 59 74 124 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 59 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 -+58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+58 73 123 59 74 124 57 72 122 58 73 123 58 73 123 58 73 123 -+58 73 123 40 57 112 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 29 46 104 53 67 120 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 55 70 121 54 70 120 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+54 69 120 53 68 119 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 48 64 117 23 40 99 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+26 43 102 51 66 119 50 65 118 49 64 117 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 48 65 116 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+48 64 117 49 65 117 31 47 105 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 -+43 58 114 45 60 114 44 59 113 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 44 60 114 43 60 114 44 60 114 -+44 60 114 44 60 114 40 57 112 28 45 102 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 36 52 108 40 56 111 40 56 111 -+40 56 111 38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 27 44 102 24 41 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 27 44 102 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 68 82 130 -+69 83 131 70 84 131 69 83 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 69 83 130 70 84 131 -+71 85 132 70 84 131 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 70 85 132 71 85 132 -+72 85 132 71 84 131 73 86 133 61 75 125 36 52 108 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+23 40 99 30 46 104 50 65 118 64 78 127 73 86 133 74 87 133 -+73 86 133 72 85 132 73 86 133 73 86 133 73 86 133 72 85 132 -+72 85 132 73 86 133 73 86 133 73 86 133 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+73 86 133 74 87 134 74 87 134 74 87 134 73 86 133 73 86 133 -+73 86 133 72 85 132 72 85 132 72 85 132 73 86 133 73 86 133 -+73 86 133 72 85 132 73 86 133 74 87 134 69 83 131 59 74 124 -+40 57 112 24 41 100 23 40 99 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 23 40 100 27 44 102 45 60 114 68 82 130 -+73 86 133 72 85 132 71 85 132 71 85 132 70 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 70 84 131 71 85 132 70 84 131 69 83 130 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+69 83 131 70 84 131 69 83 131 68 82 130 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 68 82 130 69 83 131 -+68 82 130 67 81 129 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 67 81 129 69 83 131 55 69 121 23 40 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 27 44 102 -+58 73 123 65 79 128 66 80 129 66 80 129 66 80 128 66 80 127 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+65 79 128 66 80 128 64 78 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 64 78 127 64 78 127 63 77 126 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 63 77 126 63 77 126 62 76 125 30 46 104 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 46 61 115 62 76 125 59 74 124 61 75 125 -+61 75 125 60 75 125 61 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 58 73 123 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 58 73 123 57 72 122 58 73 123 58 73 123 58 73 123 -+55 70 121 31 47 105 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 37 53 109 57 72 122 55 69 121 56 70 122 -+56 70 122 56 70 122 56 70 122 55 70 121 55 70 121 54 70 120 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 -+54 69 120 53 68 119 54 69 120 54 69 120 54 69 120 53 68 119 -+55 70 121 37 53 109 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+35 51 108 51 66 119 50 65 118 49 64 117 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 49 65 117 49 65 117 48 65 116 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 -+48 64 117 46 61 115 27 44 102 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 30 46 104 -+44 60 114 45 60 114 44 59 113 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 44 60 114 45 60 114 43 60 114 44 60 114 -+44 60 114 44 60 114 40 56 111 25 42 101 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 40 56 111 40 56 111 40 56 111 -+40 56 111 38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 37 53 109 26 43 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 30 46 104 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+68 82 130 69 83 131 70 84 131 69 83 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 69 83 130 70 84 131 -+70 84 131 71 85 132 70 84 131 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 70 85 132 71 85 132 -+71 85 132 72 85 132 72 85 132 73 86 133 68 81 130 50 65 118 -+25 43 102 23 40 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 23 40 100 29 47 104 40 57 112 58 73 123 -+73 86 133 74 87 134 73 86 133 72 85 132 73 86 133 73 86 133 -+73 86 133 72 85 132 72 85 132 72 85 132 73 86 133 73 86 133 -+73 86 133 74 87 134 74 87 134 74 87 134 74 87 134 73 86 133 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 73 86 133 74 87 134 74 87 134 -+74 87 134 73 86 133 73 86 133 73 86 133 73 86 133 72 85 132 -+72 85 132 73 86 133 73 86 133 73 86 133 72 85 132 73 86 133 -+73 86 133 75 88 134 68 82 130 50 65 118 36 52 108 25 42 101 -+23 40 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 23 40 99 36 52 108 59 74 124 72 85 132 72 85 132 -+72 84 131 71 85 132 71 85 132 70 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+70 84 131 71 85 132 70 84 131 69 83 130 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 69 83 131 -+70 84 131 69 83 131 68 82 130 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 68 82 130 -+68 82 130 67 81 129 68 82 130 68 82 130 68 82 130 68 82 130 -+67 81 129 69 83 130 59 74 124 27 44 103 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 44 60 115 -+65 79 128 66 80 129 66 80 128 66 80 129 66 80 128 66 80 127 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 65 79 128 -+66 80 128 65 79 128 64 78 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 64 78 127 63 77 126 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+63 77 126 63 77 126 64 78 127 46 61 115 23 40 99 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 28 45 103 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 59 74 124 60 75 125 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 57 72 122 58 73 123 58 73 123 58 73 123 57 72 122 -+49 65 117 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 48 63 117 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 55 70 121 54 70 120 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 -+53 68 119 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 26 43 102 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 23 40 100 -+44 60 114 51 66 119 49 64 117 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 49 65 117 48 65 116 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 -+48 64 117 40 57 112 26 43 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 34 50 107 -+45 60 114 46 61 115 44 59 113 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 44 60 114 43 60 114 44 60 114 -+44 60 114 43 59 113 37 53 109 24 41 100 24 41 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 27 44 103 40 56 111 39 55 110 39 55 111 -+40 56 111 38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 34 50 108 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 32 48 105 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 68 82 130 69 83 131 70 84 131 69 83 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 69 83 130 -+70 84 131 70 84 131 71 85 132 70 84 131 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 70 85 132 -+70 85 132 71 85 132 72 84 131 72 84 131 72 85 132 71 84 131 -+65 79 128 37 53 109 23 40 99 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 24 41 100 26 43 101 -+31 47 105 52 66 118 71 85 132 74 87 134 73 86 133 73 86 133 -+73 86 133 73 86 133 73 86 133 73 86 133 72 85 132 72 85 132 -+72 85 132 73 86 133 73 86 133 73 86 133 73 86 133 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 73 86 133 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 73 86 133 74 87 134 74 87 134 -+74 87 134 74 87 134 74 87 134 74 87 134 73 86 133 73 86 133 -+73 86 133 72 85 132 72 85 132 72 85 132 72 85 132 73 86 133 -+73 86 133 73 86 133 73 86 133 72 85 132 73 86 133 74 87 134 -+64 78 127 40 57 112 27 44 102 25 42 101 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 101 49 64 117 68 82 130 72 85 132 72 85 132 72 84 131 -+71 85 132 70 85 132 70 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 70 84 131 71 85 132 -+71 85 132 70 84 131 69 83 130 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 69 83 131 70 84 131 -+69 83 131 68 82 130 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 68 82 130 68 82 130 67 81 129 -+67 81 129 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 64 78 127 33 49 106 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 32 48 105 64 78 128 -+66 80 129 65 79 128 66 80 129 66 80 128 66 80 127 66 80 127 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+65 79 128 64 78 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 64 78 127 65 79 128 63 77 126 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 63 77 126 -+63 77 126 63 77 126 60 75 125 27 44 102 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+23 40 99 47 63 116 61 75 125 59 74 124 61 75 125 61 75 125 -+60 75 125 61 75 125 60 75 125 59 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 -+59 74 124 58 73 123 58 73 123 58 73 123 57 72 122 58 73 123 -+36 52 108 23 40 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 29 45 103 57 72 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 55 70 121 56 70 122 54 70 120 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 55 70 121 -+53 68 119 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+46 61 115 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 27 44 103 -+47 63 116 50 65 118 49 64 117 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 49 65 117 48 65 116 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 49 65 116 -+48 64 117 36 52 108 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 37 53 109 -+46 61 115 45 60 114 44 59 113 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 43 60 114 44 60 114 44 60 114 -+44 60 114 43 59 113 32 48 105 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 32 48 105 40 56 111 40 56 111 40 56 111 -+39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 38 54 111 -+39 55 111 32 48 107 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 35 51 108 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 68 82 130 69 83 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 71 85 132 71 85 132 70 84 131 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 70 85 132 71 85 132 72 85 132 72 85 132 -+72 85 132 72 85 132 52 67 118 28 45 103 25 42 101 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 23 40 100 24 41 101 40 57 112 62 76 125 70 84 131 -+71 85 132 73 86 133 73 86 133 73 86 133 72 85 132 73 86 133 -+73 86 133 73 86 133 73 86 133 73 86 133 72 85 132 72 85 132 -+72 85 132 72 85 132 72 85 132 72 85 132 73 86 133 73 86 133 -+73 86 133 73 86 133 73 86 133 73 86 133 73 86 133 73 86 133 -+73 86 133 73 86 133 73 86 133 73 86 133 73 86 133 73 86 133 -+73 86 133 73 86 133 73 86 133 73 86 133 73 86 133 72 85 132 -+72 85 132 72 85 132 72 85 132 72 85 132 73 86 133 73 86 133 -+73 86 133 73 86 133 73 86 133 72 85 132 73 86 133 73 86 133 -+73 86 133 72 85 132 71 84 131 69 83 130 53 68 119 33 49 106 -+23 40 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 25 42 101 35 52 107 -+65 79 128 73 86 133 72 85 132 72 84 131 71 85 132 70 85 132 -+70 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 70 84 131 71 85 132 70 84 131 -+69 83 130 69 83 130 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 69 83 131 70 84 131 69 83 131 -+68 82 130 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 68 82 130 69 83 131 68 82 130 67 81 129 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 67 81 129 68 82 130 -+66 80 129 42 58 112 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 25 42 101 59 74 124 66 80 129 -+65 79 128 66 80 128 66 80 128 66 80 127 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+65 79 128 64 78 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 63 77 126 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 63 77 126 -+62 76 125 64 78 127 40 57 112 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+28 45 103 61 75 125 59 74 124 61 75 125 61 75 125 61 75 125 -+61 75 125 60 75 125 59 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 58 73 123 -+59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 59 74 124 -+58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 56 71 121 -+23 40 99 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+23 40 100 42 58 112 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 55 70 121 56 70 122 54 70 120 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 53 68 119 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 55 70 121 -+36 52 108 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 34 50 106 -+49 64 117 50 65 118 49 64 117 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 49 65 117 48 65 116 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 48 63 117 -+47 63 116 31 47 105 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 26 43 102 40 57 112 -+46 61 115 44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 44 60 114 45 60 114 43 60 114 44 60 114 44 60 114 -+43 59 113 43 59 113 27 44 102 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 101 24 41 100 35 51 108 40 56 111 40 56 111 40 56 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 29 47 104 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 35 51 108 -+69 83 131 68 82 130 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 68 82 130 69 83 131 70 84 131 -+69 83 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 69 83 130 70 84 131 70 84 131 71 85 132 -+70 84 131 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 70 85 132 71 85 132 71 85 132 -+72 84 131 72 85 132 74 87 133 67 80 128 44 59 113 29 46 103 -+23 40 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 23 40 99 23 39 99 31 47 105 -+44 60 115 57 72 122 64 78 127 70 84 131 74 87 134 74 87 133 -+73 86 133 73 86 133 72 85 132 73 86 133 73 86 133 73 86 133 -+73 86 133 73 86 133 73 86 133 73 86 133 72 85 132 72 85 132 -+72 85 132 72 85 132 72 85 132 72 85 132 72 85 132 72 85 132 -+72 85 132 72 85 132 72 85 132 72 85 132 72 85 132 72 85 132 -+72 85 132 72 85 132 72 85 132 72 85 132 72 85 132 73 86 133 -+73 86 133 73 86 133 73 86 133 73 86 133 73 86 133 73 86 133 -+72 85 132 73 86 133 73 86 133 74 87 134 73 86 133 68 81 130 -+61 75 125 52 67 118 39 55 110 24 41 101 23 39 99 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 35 52 107 54 69 120 73 86 133 -+72 85 132 71 84 131 71 85 132 71 85 132 70 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 70 84 131 71 85 132 70 84 131 69 83 130 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 69 83 131 70 84 131 70 84 131 69 83 131 68 82 130 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+68 82 130 69 83 131 68 82 130 67 81 129 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 67 81 129 68 82 130 -+48 64 117 23 40 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 49 64 117 68 81 130 65 79 128 -+66 80 128 66 80 129 66 80 128 66 80 127 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 65 79 128 -+64 78 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+64 78 127 65 79 128 64 78 127 63 77 126 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 63 77 126 64 78 127 62 76 125 -+63 77 126 56 71 121 28 45 103 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 23 40 100 -+47 63 116 59 74 124 61 75 125 61 75 125 61 75 125 61 75 125 -+60 75 125 60 75 125 59 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 59 74 124 58 73 123 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 -+58 73 123 58 73 123 58 73 123 57 72 122 59 74 124 39 55 110 -+23 40 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+25 42 101 55 69 121 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 55 70 121 54 70 120 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 54 69 120 55 70 121 53 68 119 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 52 67 118 -+28 45 103 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 39 55 110 -+51 66 119 49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 48 65 116 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 48 63 117 -+44 60 114 27 44 102 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 28 45 103 44 60 114 -+46 61 115 44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 44 60 114 43 60 114 44 60 114 44 60 114 -+44 60 114 42 58 112 23 40 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 25 42 100 38 54 109 39 55 110 39 55 111 40 56 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+38 54 110 28 45 103 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 28 45 103 35 51 108 -+68 82 130 69 83 131 68 82 130 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 68 82 130 69 83 131 -+70 84 131 69 83 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 69 83 130 70 84 131 70 84 131 -+71 85 132 70 84 131 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 70 85 132 70 85 132 -+71 85 132 72 85 132 71 84 131 72 85 132 72 85 132 62 76 125 -+45 60 114 24 41 100 23 40 99 25 42 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+23 40 100 24 41 100 29 47 104 37 53 109 46 61 115 56 70 122 -+67 80 128 76 88 135 75 88 134 74 87 134 73 86 133 73 86 133 -+72 85 132 73 86 133 73 86 133 73 86 133 73 86 133 73 86 133 -+73 86 133 73 86 133 73 86 133 73 86 133 73 86 133 73 86 133 -+73 86 133 73 86 133 73 86 133 73 86 133 73 86 133 73 86 133 -+73 86 133 73 86 133 73 86 133 73 86 133 73 86 133 73 86 133 -+73 86 133 73 86 133 72 85 132 73 86 133 74 87 133 74 87 134 -+76 89 135 72 85 132 62 76 125 51 66 119 40 57 112 34 50 107 -+27 44 102 23 40 100 23 40 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+22 39 98 32 48 107 54 69 120 68 81 130 73 86 133 72 85 132 -+72 85 132 71 85 132 71 85 132 70 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+70 84 131 71 85 132 71 85 132 70 84 131 69 83 130 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+69 83 131 70 84 131 69 83 131 69 83 131 68 82 130 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 68 82 130 68 82 130 67 81 129 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 67 81 129 70 84 131 51 66 119 -+25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 23 40 99 42 57 112 66 80 129 65 79 128 66 80 129 -+66 80 129 66 80 128 66 80 127 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 65 79 128 65 79 128 65 79 128 -+64 78 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 64 78 127 64 78 127 63 77 126 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 63 77 126 63 77 126 -+62 76 125 40 57 112 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 31 47 105 -+57 72 122 61 75 125 61 75 125 61 75 125 61 75 125 60 75 125 -+60 75 125 59 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 59 74 124 59 74 124 58 73 123 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 -+57 72 122 58 73 123 58 73 123 58 73 123 57 72 122 26 43 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 23 40 100 -+37 53 109 56 70 122 55 69 121 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 53 68 119 -+54 69 120 54 69 120 54 69 120 53 68 119 54 69 120 45 60 114 -+26 43 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 27 43 102 44 60 114 -+51 66 119 49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 49 65 117 50 65 118 48 65 116 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 48 64 117 49 65 117 47 63 116 -+40 57 112 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 32 48 105 46 61 115 -+45 60 114 44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 36 52 108 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 27 44 103 38 54 110 40 56 111 40 56 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+36 52 108 26 43 102 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 31 47 105 35 51 108 -+67 81 129 68 82 130 69 83 131 68 82 130 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 68 82 130 -+69 83 131 70 84 131 69 83 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 69 83 130 69 83 130 -+70 84 131 71 85 132 70 84 131 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 72 85 132 72 85 132 72 85 132 -+71 84 131 65 79 128 40 56 111 23 40 100 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 100 24 41 100 24 41 100 24 41 100 25 42 101 26 43 102 -+27 44 102 29 47 104 42 57 112 53 68 119 63 77 126 73 86 133 -+74 87 134 74 87 133 73 86 133 73 86 133 73 86 133 73 86 133 -+72 85 132 73 86 133 73 86 133 73 86 133 73 86 133 73 86 133 -+73 86 133 73 86 133 73 86 133 73 86 133 73 86 133 73 86 133 -+73 86 133 73 86 133 73 86 133 73 86 133 73 86 133 73 86 133 -+74 87 133 74 87 134 75 88 134 70 82 131 58 73 123 48 63 117 -+36 52 108 28 45 103 27 44 102 25 42 101 24 41 100 24 41 100 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 23 40 100 27 44 102 -+53 67 120 68 82 130 71 84 131 72 85 132 72 85 132 72 84 131 -+71 85 132 71 85 132 70 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 70 84 131 70 84 131 69 83 130 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 69 83 131 68 82 130 68 82 130 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 68 82 130 -+68 82 130 67 81 129 67 81 129 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 67 81 129 69 83 131 55 69 121 26 43 102 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 33 49 106 61 75 125 66 80 129 65 79 128 66 80 128 -+66 80 129 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 65 79 128 64 78 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 64 78 127 63 77 126 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 63 77 126 64 78 127 63 77 126 63 77 126 -+56 71 121 26 43 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 44 60 114 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+60 75 125 59 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 59 74 124 59 74 124 58 73 123 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 57 72 122 -+57 72 122 58 73 123 57 72 122 59 74 124 42 58 112 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 23 40 100 -+48 63 117 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+55 70 121 56 70 122 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 53 67 120 37 53 109 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 29 46 104 50 65 118 -+50 65 118 49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 49 65 117 48 65 116 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 47 63 116 -+34 50 108 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 37 53 109 46 61 115 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 29 47 104 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 29 47 104 39 55 110 40 56 111 40 56 111 39 55 111 -+38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+35 51 108 24 41 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 33 49 106 35 51 108 -+68 82 130 67 81 129 68 82 130 69 83 131 68 82 130 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+68 82 130 69 83 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+69 83 130 70 84 131 70 84 131 71 85 132 70 84 131 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 70 85 132 70 85 132 71 85 132 71 85 132 -+71 84 131 72 85 132 73 86 133 63 77 126 37 53 109 27 44 102 -+25 42 101 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 23 40 100 23 40 99 23 40 100 -+31 47 105 39 55 110 47 63 116 54 69 120 61 75 125 66 80 128 -+68 82 130 68 82 130 70 83 130 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+69 83 130 68 82 130 68 82 130 64 78 127 58 73 123 51 66 119 -+43 60 114 35 52 107 26 43 102 23 40 99 23 40 99 24 41 100 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 25 42 101 28 45 103 48 63 117 71 84 131 -+72 85 132 72 85 132 72 85 132 72 85 132 71 85 132 70 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 70 84 131 71 85 132 71 85 132 -+70 84 131 69 83 130 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 69 83 131 70 84 131 -+69 83 131 68 82 130 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 68 82 130 69 83 131 68 82 130 -+67 81 129 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 67 81 129 68 82 130 59 74 124 29 46 104 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+27 44 102 55 69 121 66 80 129 65 79 128 66 80 129 66 80 129 -+66 80 128 66 80 127 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 65 79 128 66 80 128 65 79 128 64 78 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+64 78 127 63 77 126 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 63 77 126 62 76 125 63 77 126 -+37 53 109 23 40 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 30 46 104 57 72 122 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 60 75 125 -+59 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+59 74 124 60 75 125 58 73 123 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 57 72 122 -+58 73 123 58 73 123 58 73 123 57 72 122 31 47 105 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 31 47 105 -+53 67 120 55 69 121 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 55 70 121 54 70 120 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 50 65 118 29 47 104 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 36 52 108 52 67 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+49 65 117 50 65 118 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 48 64 117 49 65 117 48 64 117 47 63 116 -+27 44 102 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 25 42 101 43 58 114 46 61 115 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 33 49 106 40 56 111 40 56 111 40 56 111 39 55 111 -+38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 38 54 110 -+33 49 106 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 25 42 101 34 50 107 35 51 108 -+68 82 130 68 82 130 67 81 129 68 82 130 69 83 131 68 82 130 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 68 82 130 69 83 131 70 84 131 69 83 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 69 83 130 69 83 130 70 84 131 71 85 132 70 84 131 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 70 85 132 71 85 132 -+71 85 132 72 85 132 72 85 132 72 85 132 74 87 134 61 75 125 -+42 58 112 31 47 105 24 41 100 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 23 40 100 23 40 99 23 39 99 23 39 99 22 39 98 -+23 40 100 27 43 102 29 46 103 32 48 105 33 49 106 34 50 107 -+35 51 108 35 51 108 35 52 107 34 50 107 32 50 106 29 47 104 -+28 45 103 25 42 101 23 39 99 22 39 98 23 39 99 23 39 99 -+23 40 99 24 41 100 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 23 40 100 -+26 43 101 36 52 108 50 65 118 70 83 130 74 87 133 72 85 132 -+72 84 131 72 85 132 71 85 132 71 85 132 70 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 70 84 131 71 85 132 70 84 131 70 84 131 -+69 83 130 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 69 83 131 70 84 131 69 83 131 -+68 82 130 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 68 82 130 69 83 131 68 82 130 67 81 129 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+67 81 129 68 82 130 63 77 126 34 50 106 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+47 63 116 68 81 130 65 79 128 66 80 129 66 80 128 66 80 128 -+66 80 127 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+65 79 128 66 80 128 65 79 128 64 78 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 64 78 127 65 79 128 -+63 77 126 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 63 77 126 63 77 126 63 77 126 64 78 127 52 67 118 -+23 40 99 24 41 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 44 59 113 62 76 125 -+59 74 124 61 75 125 61 75 125 60 75 125 61 75 125 59 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 59 74 124 58 73 123 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 57 72 122 58 73 123 -+58 73 123 58 73 123 58 73 123 47 63 116 26 43 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 39 55 111 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 55 70 121 -+56 70 122 55 70 121 54 70 120 55 70 121 55 70 121 55 70 121 -+55 70 121 54 69 120 55 70 121 54 69 120 53 68 119 54 69 120 -+54 69 120 54 69 120 54 69 120 53 68 119 46 61 115 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 44 60 114 51 66 119 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 48 64 117 48 64 117 44 60 114 -+23 40 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 27 44 103 46 61 115 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 44 60 114 43 60 114 44 60 114 44 60 114 44 60 114 -+38 54 111 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+25 42 101 36 52 108 40 56 111 39 55 111 40 56 111 39 55 111 -+38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 38 54 110 -+30 46 104 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 27 43 102 34 50 107 35 51 108 -+68 82 130 68 82 130 68 82 130 67 81 129 68 82 130 69 83 131 -+68 82 130 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 68 82 130 69 83 131 70 84 131 70 84 131 -+69 83 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 69 83 130 70 84 131 71 85 132 -+71 85 132 70 84 131 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 70 85 132 -+70 85 132 71 85 132 71 85 132 72 84 131 72 85 132 72 85 132 -+72 85 132 64 78 127 53 67 120 37 53 109 23 40 99 23 40 99 -+24 41 100 24 41 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 101 -+24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 -+24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 -+24 41 100 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 23 39 99 28 45 102 44 60 114 -+58 73 123 68 82 130 73 86 133 72 85 132 71 84 131 72 85 132 -+71 85 132 71 85 132 70 85 132 70 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 70 84 131 71 85 132 70 84 131 70 84 131 69 83 130 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 69 83 131 68 82 130 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 68 82 130 68 82 130 67 81 129 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 67 81 129 -+68 82 130 65 79 128 34 50 107 23 40 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 23 39 99 42 58 112 -+66 80 129 66 80 129 65 79 128 66 80 128 66 80 128 66 80 127 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 65 79 128 65 79 128 64 78 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 64 78 127 65 79 128 64 78 127 -+63 77 126 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 63 77 126 63 77 126 61 75 125 28 45 103 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 29 45 103 59 74 124 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 -+60 75 125 58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 58 73 123 59 74 124 57 72 122 58 73 123 -+58 73 123 58 73 123 56 71 121 37 53 109 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 27 44 102 49 64 117 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+55 70 121 55 70 121 54 70 120 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 54 69 120 54 69 120 53 68 119 54 69 120 -+54 69 120 54 69 120 54 69 120 53 68 119 37 53 109 23 40 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 27 44 102 51 66 119 50 65 118 -+49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 49 65 117 48 65 116 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 48 64 117 48 64 117 36 52 108 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 35 52 107 46 61 115 45 60 114 -+44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 44 60 114 43 60 114 44 60 114 43 59 113 44 60 114 -+32 50 106 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+27 44 102 37 53 109 40 56 111 40 56 111 39 55 111 39 55 111 -+38 54 111 39 55 111 39 55 111 39 55 111 38 54 110 38 54 110 -+26 43 102 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 29 45 103 34 50 107 35 51 108 -+68 82 130 68 82 130 68 82 130 68 82 130 67 81 129 68 82 130 -+69 83 131 68 82 130 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 68 82 130 69 83 131 69 83 131 -+70 84 131 69 83 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 71 85 132 70 84 131 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 70 85 132 71 85 132 71 85 132 71 85 132 72 85 132 -+72 85 132 72 85 132 71 84 131 70 83 130 64 78 127 44 60 114 -+26 43 101 23 40 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 23 40 99 32 48 105 54 69 120 68 81 130 70 84 131 -+72 85 132 72 85 132 72 85 132 72 84 131 71 85 132 71 85 132 -+71 85 132 70 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+70 84 131 71 85 132 70 84 131 70 84 131 69 83 130 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 69 83 131 69 83 131 69 83 131 69 83 131 68 82 130 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 68 82 130 68 82 130 67 81 129 67 81 129 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 67 81 129 68 82 130 -+67 81 129 32 50 106 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 23 40 100 36 52 108 64 78 128 -+66 80 129 65 79 128 66 80 128 66 80 129 66 80 128 66 80 127 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 65 79 128 64 78 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 64 78 127 63 77 126 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+63 77 126 64 78 127 62 76 125 64 78 127 40 56 111 25 42 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 23 39 99 50 65 118 61 75 125 59 74 124 -+61 75 125 61 75 125 60 75 125 61 75 125 60 75 125 59 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 58 73 123 57 72 122 58 73 123 -+58 73 123 58 73 123 53 68 119 25 42 101 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 32 48 107 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+55 70 121 54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 54 69 120 53 68 119 54 69 120 54 69 120 -+54 69 120 54 69 120 53 68 119 54 69 120 26 43 101 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 37 53 109 52 67 118 50 65 118 -+49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 -+50 65 118 49 65 117 48 65 116 49 65 117 49 65 117 49 65 117 -+49 65 117 48 64 117 49 65 117 48 64 116 50 65 118 27 44 102 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 23 40 100 42 57 112 46 61 115 45 60 114 -+44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 -+45 60 114 44 60 114 43 60 114 44 60 114 44 60 114 44 60 114 -+28 45 102 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+28 45 103 38 56 110 40 56 111 40 56 111 39 55 111 38 54 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 37 53 109 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 31 47 105 35 51 108 35 51 108 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 67 81 129 -+68 82 130 69 83 131 68 82 130 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 68 82 130 -+69 83 131 70 84 131 70 84 131 69 83 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+69 83 130 69 83 130 70 84 131 71 85 132 71 85 132 70 84 131 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 70 85 132 70 85 132 -+71 85 132 71 85 132 72 85 132 72 84 131 72 85 132 73 86 133 -+71 85 132 55 70 121 36 52 108 27 44 102 26 43 101 24 41 100 -+24 41 100 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 24 41 100 25 42 101 26 43 102 30 46 104 -+44 59 113 64 78 127 74 87 133 72 85 132 72 85 132 72 84 131 -+71 85 132 71 85 132 71 85 132 70 85 132 70 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 70 84 131 71 85 132 70 84 131 -+70 84 131 69 83 130 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 69 83 131 -+70 84 131 69 83 131 68 82 130 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 68 82 130 -+69 83 131 68 82 130 67 81 129 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 67 81 129 68 82 130 65 79 128 -+36 52 108 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 31 47 105 61 75 125 66 80 129 -+66 80 128 66 80 129 66 80 129 66 80 127 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+65 79 128 64 78 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 64 78 127 63 77 126 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 62 76 125 63 77 126 54 69 120 28 45 103 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 100 24 41 100 34 50 107 61 75 125 59 74 124 61 75 125 -+61 75 125 61 75 125 61 75 125 60 75 125 59 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+59 74 124 58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 58 73 123 58 73 123 58 73 123 58 73 123 -+57 72 122 58 73 123 40 56 111 23 40 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 45 60 114 56 70 122 -+55 69 121 56 70 122 56 70 122 56 70 122 56 70 122 55 70 121 -+54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 54 69 120 54 69 120 53 68 119 54 69 120 54 69 120 -+54 69 120 53 68 119 54 69 120 43 59 113 23 40 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 23 40 100 47 63 116 50 65 118 49 64 117 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+49 65 117 48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 48 64 117 48 64 117 43 59 113 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 26 43 102 46 61 115 45 60 114 44 59 113 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+44 60 114 43 60 114 44 60 114 44 60 114 44 60 114 40 57 112 -+26 43 102 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+31 47 105 40 56 111 39 55 110 40 56 111 39 55 111 38 54 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 34 50 107 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 25 42 101 32 48 107 35 51 108 35 51 108 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+67 81 129 68 82 130 69 83 131 69 83 131 68 82 130 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+68 82 130 69 83 131 69 83 131 70 84 131 69 83 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 69 83 130 70 84 131 70 84 131 71 85 132 -+70 84 131 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+70 85 132 71 85 132 71 85 132 71 85 132 72 85 132 72 84 131 -+72 85 132 73 86 133 74 87 133 67 80 128 53 68 119 40 57 112 -+34 50 107 27 44 102 23 40 100 23 40 100 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 24 41 100 23 40 99 -+24 41 100 31 47 105 37 53 109 46 61 115 58 73 123 71 85 132 -+74 87 133 72 85 132 71 84 131 72 85 132 71 85 132 71 85 132 -+71 85 132 70 85 132 70 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 70 84 131 71 85 132 70 84 131 70 84 131 -+69 83 130 69 83 130 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+69 83 131 68 82 130 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 68 82 130 69 83 131 -+68 82 130 67 81 129 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 67 81 129 68 82 130 65 79 128 39 55 111 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 27 44 102 55 69 121 66 80 129 65 79 128 -+66 80 129 66 80 128 66 80 128 66 80 127 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 65 79 128 66 80 128 -+64 78 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 64 78 127 64 78 127 63 77 126 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 63 77 126 64 78 127 -+63 77 126 62 76 125 61 75 125 38 54 109 24 41 100 24 41 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 25 42 101 52 67 118 59 74 124 61 75 125 61 75 125 -+61 75 125 61 75 125 60 75 125 60 75 125 59 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 -+58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+58 73 123 59 74 124 58 73 123 57 72 122 58 73 123 58 73 123 -+58 73 123 55 70 121 25 43 102 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 27 44 102 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 55 70 121 56 70 122 -+54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+54 69 120 55 70 121 53 68 119 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 55 70 121 29 47 104 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 29 46 104 51 66 119 50 65 118 49 64 117 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+49 65 117 48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 48 64 116 49 65 117 35 51 108 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 33 49 106 46 61 115 45 60 114 44 59 113 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+44 60 114 43 60 114 44 60 114 43 59 113 44 60 114 37 53 109 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+35 52 107 40 56 111 40 56 111 39 55 111 39 55 111 38 54 111 -+39 55 111 39 55 111 39 55 111 38 54 111 39 55 111 29 46 104 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 26 43 102 33 49 106 35 51 108 35 51 108 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 67 81 129 68 82 130 68 82 130 69 83 131 68 82 130 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 68 82 130 68 82 130 69 83 131 70 84 131 69 83 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 69 83 130 69 83 130 70 84 131 70 84 131 -+71 85 132 70 84 131 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 70 85 132 70 85 132 70 85 132 71 85 132 71 85 132 -+72 85 132 72 85 132 72 85 132 72 85 132 73 86 133 73 86 133 -+67 80 128 59 74 124 53 67 120 43 58 114 32 50 106 24 41 100 -+23 39 99 23 40 99 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+23 40 100 23 39 99 23 39 99 27 43 102 37 53 109 47 63 116 -+57 72 122 63 77 126 70 83 130 73 86 133 72 85 132 72 85 132 -+72 84 131 72 85 132 71 85 132 71 85 132 71 85 132 70 85 132 -+70 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+70 84 131 71 85 132 71 85 132 70 84 131 69 83 130 69 83 130 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 69 83 131 69 83 131 69 83 131 -+69 83 131 68 82 130 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 68 82 130 69 83 131 68 82 130 -+68 82 130 67 81 129 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 67 81 129 68 82 130 67 81 129 37 53 109 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 101 23 40 99 51 66 119 66 81 129 66 80 129 65 79 128 -+66 80 129 66 80 128 66 80 127 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 65 79 128 66 80 128 65 79 128 -+64 78 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 64 78 127 64 78 127 63 77 126 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 63 77 126 -+63 77 126 63 77 126 50 65 118 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 37 53 109 59 74 124 61 75 125 61 75 125 61 75 125 -+61 75 125 60 75 125 60 75 125 59 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 59 74 124 -+58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 58 73 123 58 73 123 57 72 122 58 73 123 57 72 122 -+59 74 124 39 55 110 23 40 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 23 40 99 42 58 112 56 70 122 55 69 121 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 55 70 121 -+54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 54 69 120 53 68 119 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 48 63 117 24 41 100 25 42 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 23 40 99 40 57 112 51 66 119 50 65 118 49 64 117 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 -+49 65 117 48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 48 64 117 48 64 117 48 63 117 28 45 103 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 23 40 100 39 55 111 46 61 115 45 60 114 44 59 113 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+44 60 114 43 60 114 44 60 114 44 60 114 44 60 114 33 49 106 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+39 55 110 40 56 111 40 56 111 39 55 111 38 54 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 110 39 55 111 25 42 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 27 44 102 34 50 107 35 51 108 35 51 108 -+68 82 130 67 81 129 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 67 81 129 67 81 129 68 82 130 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 68 82 130 68 82 130 69 83 131 70 84 131 -+69 83 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 69 83 130 69 83 130 -+70 84 131 71 85 132 71 85 132 70 84 131 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 70 85 132 71 85 132 -+71 85 132 71 85 132 72 85 132 72 85 132 72 84 131 72 85 132 -+72 85 132 72 85 132 71 85 132 70 84 131 68 82 130 67 80 128 -+59 72 123 46 61 115 36 52 108 25 42 101 23 40 99 23 40 100 -+23 40 100 24 41 100 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 24 41 100 23 40 100 23 40 99 23 40 99 29 45 103 -+40 56 111 50 65 118 63 77 126 68 82 130 70 83 130 71 84 131 -+72 85 132 72 85 132 72 85 132 72 85 132 72 85 132 72 85 132 -+71 85 132 71 85 132 71 85 132 70 85 132 70 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 70 84 131 -+71 85 132 70 84 131 70 84 131 69 83 130 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 69 83 131 70 84 131 70 84 131 69 83 131 68 82 130 -+68 82 130 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 68 82 130 69 83 131 68 82 130 68 82 130 -+67 81 129 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+67 81 129 68 82 130 67 81 129 34 50 106 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+23 40 99 50 65 118 66 80 129 66 80 129 65 79 128 66 80 128 -+66 80 128 66 80 127 66 80 127 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 65 79 128 66 80 128 65 79 128 64 78 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+64 78 127 65 79 128 64 78 127 63 77 126 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 63 77 126 -+63 77 126 62 76 125 27 44 103 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+27 44 102 53 67 120 61 75 125 61 75 125 61 75 125 61 75 125 -+60 75 125 61 75 125 60 75 125 59 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 59 74 124 59 74 124 58 73 123 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 58 73 123 57 72 122 58 73 123 58 73 123 58 73 123 -+55 70 121 25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 26 43 102 55 69 121 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 55 70 121 56 70 122 54 70 120 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 53 68 119 54 69 120 54 69 120 54 69 120 54 69 120 -+53 68 119 55 70 121 35 52 107 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 25 42 101 47 63 116 50 65 118 49 64 117 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 -+48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 48 64 117 48 64 117 42 58 112 26 43 102 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 26 43 102 43 58 114 45 60 114 44 59 113 44 59 113 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 -+43 60 114 43 60 114 44 60 114 44 60 114 42 58 112 29 46 104 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 27 44 103 -+40 56 111 40 56 111 40 56 111 39 55 111 38 54 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 36 52 108 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 28 45 103 35 51 108 35 51 108 35 51 108 -+51 67 118 68 82 130 68 82 130 67 81 129 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 67 81 129 68 82 130 -+69 83 131 68 82 130 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 68 82 130 68 82 130 -+69 83 131 70 84 131 70 84 131 69 83 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+69 83 130 69 83 130 70 84 131 70 84 131 71 85 132 71 85 132 -+70 84 131 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 70 85 132 70 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 72 85 132 72 85 132 72 84 131 72 85 132 -+72 85 132 73 85 132 73 86 133 73 86 133 67 80 128 58 73 123 -+49 64 117 40 57 112 34 50 107 30 46 104 28 45 103 27 44 102 -+27 44 102 27 43 102 26 43 102 26 43 102 26 43 101 26 43 101 -+26 43 101 26 43 101 26 43 101 26 43 101 26 43 101 26 43 102 -+26 43 102 27 44 102 27 44 102 27 44 103 28 45 103 31 47 105 -+38 54 110 44 61 114 53 67 120 61 75 125 71 84 131 74 87 133 -+73 86 133 72 85 132 72 85 132 71 84 131 72 85 132 72 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 70 85 132 70 85 132 -+70 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 70 84 131 70 84 131 -+69 83 130 69 83 130 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 69 83 131 -+70 84 131 70 84 131 69 83 131 68 82 130 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+68 82 130 69 83 131 69 83 131 67 81 129 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 67 81 129 -+68 82 130 64 78 127 34 50 107 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+44 60 114 66 80 129 65 79 128 66 80 128 66 80 129 66 80 128 -+66 80 127 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 65 79 128 64 78 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 63 77 126 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 63 77 126 64 78 127 63 77 126 62 76 125 -+64 78 127 37 53 109 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+38 56 110 63 77 126 61 75 125 61 75 125 61 75 125 60 75 125 -+61 75 125 59 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 59 74 124 60 75 125 58 73 123 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 -+58 73 123 57 72 122 58 73 123 58 73 123 58 73 123 59 74 124 -+38 54 110 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 23 40 100 40 56 111 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 55 70 121 56 70 122 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+54 69 120 53 68 119 54 69 120 54 69 120 54 69 120 53 68 119 -+54 69 120 51 66 119 28 45 103 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 101 -+24 41 100 33 49 106 49 64 117 50 65 118 49 64 117 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 -+48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 48 64 117 48 64 117 37 53 109 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 31 47 105 44 60 114 45 60 114 44 59 113 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 44 60 114 -+43 60 114 44 60 114 44 60 114 44 60 114 40 56 111 26 43 102 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 32 48 105 -+40 56 111 40 56 111 40 56 111 39 55 111 38 54 111 39 55 111 -+39 55 111 39 55 111 38 54 111 39 55 111 32 48 107 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 29 47 104 35 51 108 35 51 108 35 51 108 -+24 41 100 48 63 117 67 81 129 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 67 81 129 -+68 82 130 69 83 131 69 83 131 68 82 130 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+68 82 130 69 83 131 69 83 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 69 83 130 69 83 130 70 84 131 70 84 131 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 70 85 132 70 85 132 -+70 85 132 71 85 132 71 85 132 71 85 132 71 85 132 72 85 132 -+72 85 132 72 85 132 72 84 131 72 85 132 72 85 132 73 86 133 -+73 86 133 74 87 133 74 87 133 74 87 134 71 84 131 67 80 128 -+63 77 126 61 75 125 58 73 123 56 71 121 54 69 120 53 68 119 -+52 67 118 52 67 118 53 68 119 54 69 120 55 70 121 57 72 122 -+59 74 124 62 76 125 65 79 128 68 82 130 73 85 132 74 87 134 -+74 87 133 73 86 133 73 86 133 72 85 132 72 85 132 71 84 131 -+72 85 132 72 85 132 72 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 70 85 132 70 85 132 70 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+70 84 131 71 85 132 70 84 131 70 84 131 70 84 131 69 83 130 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 69 83 131 70 84 131 -+69 83 131 69 83 131 68 82 130 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 68 82 130 68 82 130 67 81 129 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 67 81 129 68 82 130 -+62 76 125 36 52 108 23 40 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 39 55 110 -+64 78 127 66 80 129 66 80 128 66 80 129 66 80 128 66 80 127 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 65 79 128 65 79 128 64 78 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 64 78 127 65 79 128 -+64 78 127 63 77 126 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 63 77 126 62 76 125 64 78 127 -+49 64 117 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 27 44 103 -+58 73 123 61 75 125 60 75 125 61 75 125 61 75 125 61 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 59 74 124 58 73 123 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+58 73 123 57 72 122 58 73 123 58 73 123 58 73 123 53 67 120 -+28 45 103 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 27 43 102 50 65 118 55 69 121 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 55 70 121 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 42 58 112 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+25 42 100 39 55 111 51 66 119 49 64 117 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 48 65 116 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 48 63 117 47 63 116 31 47 105 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 36 52 108 46 61 115 45 60 114 44 59 113 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 -+43 60 114 44 60 114 44 60 114 43 59 113 37 53 109 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 37 53 109 -+40 56 111 40 56 111 40 56 111 38 54 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 110 39 55 111 28 45 103 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 33 49 106 35 51 108 35 51 108 35 51 108 -+24 41 100 25 42 101 44 60 114 68 82 130 68 82 130 67 81 129 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+67 81 129 68 82 130 68 82 130 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+68 82 130 68 82 130 69 83 131 70 84 131 70 84 131 69 83 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 69 83 130 70 84 131 -+70 84 131 71 85 132 71 85 132 71 85 132 70 84 131 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 70 85 132 70 85 132 70 85 132 70 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 72 85 132 72 85 132 72 85 132 -+72 85 132 72 85 132 71 85 132 72 85 132 72 85 132 72 85 132 -+72 85 132 72 85 132 73 85 132 73 86 133 73 86 133 73 86 133 -+73 86 133 73 86 133 73 86 133 73 86 133 73 86 133 73 85 132 -+72 85 132 72 85 132 72 85 132 72 85 132 72 85 132 72 85 132 -+72 85 132 72 85 132 72 85 132 72 85 132 72 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 70 85 132 70 85 132 -+70 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 70 84 131 71 85 132 -+71 85 132 70 84 131 70 84 131 69 83 130 69 83 130 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 69 83 131 70 84 131 70 84 131 69 83 131 -+68 82 130 68 82 130 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 68 82 130 69 83 131 -+68 82 130 68 82 130 67 81 129 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 67 81 129 69 83 131 59 74 124 -+32 50 106 23 40 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 23 40 100 36 52 108 64 78 127 -+66 80 129 65 79 128 66 80 129 66 80 128 66 80 128 66 80 127 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+65 79 128 66 80 128 65 79 128 64 78 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 64 78 127 -+64 78 127 63 77 126 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 63 77 126 64 78 127 62 76 125 63 77 126 57 72 122 -+30 46 104 24 41 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 101 23 39 99 49 64 117 -+62 76 125 59 74 124 61 75 125 61 75 125 60 75 125 61 75 125 -+60 75 125 59 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 59 74 124 60 75 125 58 73 123 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 59 74 124 -+57 72 122 58 73 123 58 73 123 58 73 123 58 73 123 40 57 112 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 100 -+24 41 100 36 52 108 55 69 121 55 69 121 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 55 70 121 54 70 120 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+52 67 118 34 50 107 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+27 44 102 46 61 115 51 66 119 49 64 117 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 49 65 117 50 65 118 48 65 116 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 -+49 65 117 48 64 117 44 60 114 26 43 102 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+26 43 102 40 56 111 46 61 115 44 59 113 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 43 60 114 -+44 60 114 44 60 114 44 60 114 43 59 113 32 48 107 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 40 56 111 -+40 56 111 39 55 111 40 56 111 38 54 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 38 54 110 26 43 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 101 25 42 101 35 51 108 35 51 108 35 51 108 35 51 108 -+25 42 101 24 41 100 24 41 100 38 54 110 70 82 131 68 82 130 -+67 81 129 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+67 81 129 67 81 129 67 81 129 68 82 130 68 82 130 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 68 82 130 69 83 131 69 83 131 70 84 131 -+70 84 131 69 83 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 69 83 130 -+69 83 130 70 84 131 70 84 131 70 84 131 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 70 85 132 70 85 132 -+70 85 132 70 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 72 85 132 72 85 132 72 85 132 72 85 132 -+72 85 132 72 85 132 72 85 132 72 85 132 72 85 132 72 85 132 -+72 85 132 72 85 132 72 85 132 72 85 132 72 85 132 72 85 132 -+72 85 132 72 85 132 72 85 132 72 85 132 72 85 132 72 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+70 85 132 70 85 132 70 85 132 70 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 70 84 131 71 85 132 71 85 132 70 84 131 -+70 84 131 69 83 130 69 83 130 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 69 83 131 69 83 131 68 82 130 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 68 82 130 69 83 131 68 82 130 -+68 82 130 67 81 129 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 67 81 129 69 83 131 56 71 121 27 44 102 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 23 40 100 34 50 106 65 79 128 66 80 129 -+65 79 128 66 80 129 66 80 128 66 80 127 66 80 127 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 65 79 128 -+66 80 128 65 79 128 64 78 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 64 78 127 64 78 127 63 77 126 -+63 77 126 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+63 77 126 64 78 127 63 77 126 62 76 125 62 76 125 39 55 111 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 23 40 100 37 53 109 59 74 124 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 60 75 125 -+59 75 125 59 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 -+57 72 122 58 73 123 58 73 123 57 72 122 54 69 120 29 46 104 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+26 43 102 46 61 115 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 55 70 121 56 70 122 55 70 121 54 70 120 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 -+53 68 119 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+49 64 117 26 43 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+31 47 105 51 66 119 50 65 118 49 64 117 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 48 65 116 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+48 64 117 47 63 116 38 54 111 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+28 45 103 44 60 114 46 61 115 44 59 113 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 44 60 114 45 60 114 43 60 114 -+44 60 114 44 60 114 43 59 113 43 59 113 26 43 101 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 29 47 104 40 56 111 -+39 55 110 40 56 111 39 55 111 38 54 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 34 50 107 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 28 45 103 35 51 108 34 50 107 35 51 108 35 51 108 -+25 42 101 25 42 101 25 42 101 24 41 100 34 50 107 65 79 128 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 67 81 129 68 82 130 68 82 130 -+69 83 131 68 82 130 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 68 82 130 68 82 130 -+69 83 131 70 84 131 70 84 131 69 83 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 69 83 130 69 83 130 70 84 131 -+70 84 131 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 70 85 132 70 85 132 70 85 132 70 85 132 70 85 132 -+70 85 132 70 85 132 70 85 132 70 85 132 70 85 132 70 85 132 -+70 85 132 70 85 132 70 85 132 70 85 132 70 85 132 70 85 132 -+70 85 132 70 85 132 70 85 132 70 85 132 70 85 132 70 85 132 -+70 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 70 84 131 71 85 132 -+71 85 132 70 84 131 70 84 131 69 83 130 69 83 130 69 83 130 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 69 83 131 70 84 131 -+70 84 131 69 83 131 69 83 131 68 82 130 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 68 82 130 69 83 131 69 83 131 68 82 130 67 81 129 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+67 81 129 68 82 130 68 81 130 54 69 120 27 43 102 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 32 50 106 65 79 128 66 80 129 65 79 128 -+66 80 128 66 80 129 66 80 128 66 80 127 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+65 79 128 64 78 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 64 78 127 65 79 128 63 77 126 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 63 77 126 62 76 125 63 77 126 52 66 118 23 40 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 27 44 102 55 69 121 61 75 125 -+61 75 125 61 75 125 61 75 125 60 75 125 61 75 125 60 75 125 -+59 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 59 74 124 58 73 123 59 74 124 59 74 124 -+59 74 124 59 74 124 58 73 123 59 74 124 58 73 123 58 73 123 -+58 73 123 58 73 123 57 72 122 58 73 123 43 59 113 23 40 99 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+31 47 105 55 69 121 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 55 70 121 54 70 120 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 -+53 68 119 54 69 120 54 69 120 54 69 120 53 68 119 53 68 119 -+39 55 111 23 40 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+40 56 111 51 66 119 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 49 65 117 50 65 118 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 49 65 117 -+48 64 116 47 63 116 31 47 105 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+33 49 106 47 63 116 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 39 55 111 23 40 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 101 24 41 100 34 50 107 40 56 111 -+40 56 111 40 56 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 32 48 107 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 31 47 105 35 51 108 35 51 108 35 51 108 35 51 108 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 32 48 105 -+59 74 124 68 82 130 67 81 129 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 67 81 129 68 82 130 -+68 82 130 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+68 82 130 69 83 131 69 83 131 70 84 131 70 84 131 69 83 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 69 83 130 -+70 84 131 70 84 131 70 84 131 71 85 132 71 85 132 71 85 132 -+70 84 131 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 70 84 131 -+70 84 131 70 84 131 69 83 130 69 83 130 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 69 83 131 70 84 131 69 83 131 -+69 83 131 68 82 130 68 82 130 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+68 82 130 69 83 131 68 82 130 68 82 130 67 81 129 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 67 81 129 -+68 82 130 67 81 129 48 64 117 25 42 101 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 34 50 107 62 76 125 66 80 129 65 79 128 66 80 128 -+66 80 129 66 80 128 66 80 127 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 65 79 128 -+64 78 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 64 78 127 65 79 128 64 78 127 63 77 126 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 63 77 126 -+63 77 126 63 77 126 63 77 126 58 73 123 27 44 103 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 100 42 57 112 59 74 124 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 60 75 125 59 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 59 74 124 58 73 123 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 58 73 123 58 73 123 57 72 122 -+58 73 123 58 73 123 58 73 123 56 71 121 26 43 102 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+45 60 114 56 70 122 55 69 121 56 70 122 56 70 122 56 70 122 -+56 70 122 55 70 121 55 70 121 54 70 120 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 53 68 119 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 53 68 119 -+27 44 103 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 26 43 101 -+50 65 118 50 65 118 49 64 117 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 -+48 64 117 46 61 115 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+39 55 111 46 61 115 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 44 60 114 -+44 60 114 43 59 113 44 60 114 33 49 106 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 25 42 100 38 54 110 39 55 110 -+39 55 111 40 56 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 38 54 110 29 46 104 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 34 50 107 35 51 108 35 51 108 35 51 108 35 51 108 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+29 46 104 53 68 119 70 84 131 67 81 129 67 81 129 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 67 81 129 -+68 82 130 69 83 131 69 83 131 68 82 130 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 68 82 130 68 82 130 69 83 131 69 83 131 70 84 131 -+69 83 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+69 83 130 69 83 130 69 83 130 70 84 131 70 84 131 70 84 131 -+71 85 132 71 85 132 70 84 131 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 70 84 131 -+71 85 132 71 85 132 70 84 131 70 84 131 70 84 131 69 83 130 -+69 83 130 69 83 130 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 69 83 131 70 84 131 70 84 131 69 83 131 69 83 131 -+68 82 130 68 82 130 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 68 82 130 69 83 131 -+69 83 131 68 82 130 67 81 129 67 81 129 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 67 81 129 69 83 130 -+65 79 128 39 55 111 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+33 49 106 61 75 125 66 80 129 66 80 129 66 80 128 66 80 129 -+66 80 128 66 80 127 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 65 79 128 65 79 128 65 79 128 -+64 78 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+64 78 127 65 79 128 64 78 127 63 77 126 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 63 77 126 64 78 127 -+63 77 126 63 77 126 63 77 126 34 50 106 23 40 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 29 47 104 58 73 123 61 75 125 59 74 124 -+61 75 125 61 75 125 60 75 125 61 75 125 59 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 -+59 74 124 59 74 124 58 73 123 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 58 73 123 57 72 122 58 73 123 -+58 73 123 57 72 122 59 74 124 38 54 110 23 40 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 29 46 104 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+55 70 121 56 70 122 54 70 120 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 54 69 120 54 69 120 53 68 119 -+54 69 120 54 69 120 54 69 120 53 67 120 54 69 120 43 59 113 -+23 40 99 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 35 51 108 -+52 67 118 50 65 118 49 64 117 50 65 118 50 65 118 50 65 118 -+50 65 118 49 65 117 50 65 118 49 65 117 48 65 116 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 -+48 64 117 36 52 108 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 26 43 101 -+46 61 115 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 44 60 114 45 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 25 42 101 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 28 45 103 39 55 110 40 56 111 -+40 56 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 37 53 109 27 44 102 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+25 42 101 35 51 108 34 50 107 35 51 108 35 51 108 34 50 107 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 25 42 101 44 60 114 69 83 130 68 82 130 67 81 129 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+67 81 129 68 82 130 68 82 130 69 83 131 68 82 130 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 68 82 130 68 82 130 69 83 131 69 83 131 -+70 84 131 70 84 131 69 83 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 69 83 130 69 83 130 70 84 131 -+70 84 131 70 84 131 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 70 84 131 71 85 132 71 85 132 -+70 84 131 70 84 131 70 84 131 69 83 130 69 83 130 69 83 130 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 69 83 131 69 83 131 68 82 130 68 82 130 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 68 82 130 -+68 82 130 67 81 129 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 67 81 129 68 82 130 62 76 125 -+32 50 106 24 41 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 31 47 105 -+64 78 128 66 80 129 66 80 129 65 79 128 66 80 129 66 80 128 -+66 80 127 66 80 127 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 65 79 128 66 80 128 65 79 128 64 78 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 64 78 127 63 77 126 63 77 126 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 63 77 126 -+62 76 125 64 78 127 40 57 112 25 42 101 24 41 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 50 65 118 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 60 75 125 59 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+59 74 124 58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 58 73 123 57 72 122 57 72 122 58 73 123 -+58 73 123 58 73 123 53 67 120 25 42 101 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 23 40 99 46 61 115 -+56 70 122 55 69 121 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 55 70 121 54 70 120 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 54 69 120 55 70 121 53 68 119 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 55 70 121 27 44 103 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 101 23 40 99 48 63 117 -+50 65 118 49 64 117 49 64 117 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 49 65 117 48 65 116 48 65 116 49 65 117 -+49 65 117 49 65 117 49 65 117 48 64 117 49 65 117 48 64 116 -+48 64 117 26 43 102 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 32 50 106 -+46 61 115 45 60 114 44 59 113 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 44 60 114 43 60 114 44 60 114 -+44 60 114 44 60 114 38 56 110 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 32 48 105 39 55 110 40 56 111 -+40 56 111 39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 35 51 108 24 41 101 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+28 45 104 35 51 108 35 51 108 35 51 108 35 51 108 35 51 108 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 38 56 110 64 78 127 68 82 130 -+68 82 130 67 81 129 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 67 81 129 68 82 130 68 82 130 69 83 131 -+69 83 131 68 82 130 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+68 82 130 69 83 131 69 83 131 70 84 131 70 84 131 69 83 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 69 83 130 69 83 130 69 83 130 70 84 131 -+70 84 131 70 84 131 70 84 131 71 85 132 71 85 132 71 85 132 -+70 84 131 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+70 84 131 70 84 131 70 84 131 70 84 131 69 83 130 69 83 130 -+69 83 130 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 69 83 131 70 84 131 70 84 131 69 83 131 -+69 83 131 68 82 130 68 82 130 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 68 82 130 69 83 131 68 82 130 68 82 130 67 81 129 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 67 81 129 68 82 130 67 81 129 57 72 122 28 45 103 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 34 50 107 65 79 128 -+66 80 129 65 79 128 66 80 128 66 80 129 66 80 128 66 80 127 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+65 79 128 66 80 128 66 80 128 64 78 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 64 78 127 -+65 79 128 64 78 127 63 77 126 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 63 77 126 64 78 127 64 78 127 63 77 126 -+63 77 126 51 66 119 27 43 102 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 38 54 110 63 77 126 59 74 124 61 75 125 61 75 125 -+60 75 125 61 75 125 61 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 -+58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 58 73 123 57 72 122 58 73 123 58 73 123 -+58 73 123 59 74 124 35 51 108 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 31 47 105 56 70 122 -+55 69 121 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+55 70 121 54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 54 69 120 55 70 121 53 68 119 54 69 120 54 69 120 -+54 69 120 54 69 120 53 68 119 54 69 120 44 60 114 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 31 47 105 51 66 119 -+50 65 118 49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 49 65 117 48 65 116 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 48 64 116 48 64 117 -+42 58 112 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 40 57 112 -+46 61 115 45 60 114 44 59 113 45 60 114 45 60 114 45 60 114 -+45 60 114 44 60 114 45 60 114 44 60 114 43 60 114 44 60 114 -+44 60 113 44 60 114 32 50 106 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 25 42 101 35 52 107 40 56 111 39 55 111 -+40 56 111 39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 -+39 55 111 38 54 110 33 49 106 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+31 47 105 35 51 108 35 51 108 35 51 108 35 51 108 35 51 108 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 23 40 99 33 49 106 57 72 122 -+69 83 131 68 82 130 67 81 129 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 67 81 129 67 81 129 68 82 130 -+68 82 130 69 83 131 68 82 130 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 68 82 130 68 82 130 69 83 131 69 83 131 70 84 131 -+70 84 131 69 83 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 69 83 130 -+69 83 130 69 83 130 70 84 131 70 84 131 70 84 131 70 84 131 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 70 84 131 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 70 84 131 71 85 132 71 85 132 -+71 85 132 71 85 132 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 69 83 130 69 83 130 69 83 130 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 69 83 131 70 84 131 69 83 131 69 83 131 68 82 130 -+68 82 130 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 68 82 130 67 81 129 67 81 129 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 65 79 128 47 63 116 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 37 53 109 63 77 126 66 80 129 -+65 79 128 66 80 128 66 80 129 66 80 128 66 80 127 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 65 79 128 65 79 128 64 78 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 64 78 127 65 79 128 -+64 78 127 63 77 126 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 63 77 126 63 77 126 63 77 126 -+58 73 123 31 47 105 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+29 47 104 59 74 124 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 60 75 125 60 75 125 59 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 59 74 124 60 75 125 58 73 123 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+58 73 123 59 74 124 57 72 122 58 73 123 58 73 123 58 73 123 -+58 73 123 49 64 117 26 43 102 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 46 61 115 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 55 70 121 56 70 122 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 54 69 120 53 68 119 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 32 48 107 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 23 40 100 43 58 114 51 66 119 -+49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 49 65 117 49 65 117 48 65 116 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 49 64 117 -+32 50 106 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 27 43 102 46 61 115 -+45 60 114 44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 44 60 114 44 60 114 43 60 114 44 60 114 -+44 60 114 43 60 114 27 44 103 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 26 43 102 37 53 109 40 56 111 40 56 111 -+39 55 111 39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 -+39 55 111 38 54 110 29 45 103 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+34 50 107 34 50 107 35 51 108 35 51 108 35 51 108 35 51 108 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 23 40 100 28 45 102 -+46 61 115 67 81 129 68 82 130 67 81 129 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 67 81 129 -+67 81 129 68 82 130 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 68 82 130 68 82 130 69 83 131 -+69 83 131 70 84 131 70 84 131 69 83 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 69 83 130 69 83 130 69 83 130 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 70 84 131 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 70 84 131 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 69 83 130 69 83 130 69 83 130 -+69 83 130 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 69 83 131 70 84 131 -+70 84 131 70 84 131 69 83 131 69 83 131 68 82 130 68 82 130 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 68 82 130 69 83 131 -+68 82 130 68 82 130 68 82 130 67 81 129 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 67 81 129 -+69 83 130 60 75 125 36 52 108 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 23 40 99 39 55 111 63 77 126 66 80 129 66 80 129 -+66 80 128 66 80 129 66 80 128 66 80 127 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 65 79 128 -+65 79 128 65 79 128 64 78 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 64 78 127 65 79 128 64 78 127 -+63 77 126 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 63 77 126 63 77 126 62 76 125 64 78 127 -+37 53 109 23 40 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 25 43 102 -+51 66 119 61 75 125 59 74 124 61 75 125 61 75 125 61 75 125 -+61 75 125 60 75 125 59 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 59 74 124 60 75 125 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 58 73 123 57 72 122 58 73 123 58 73 123 57 72 122 -+56 71 121 36 52 108 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 32 48 105 53 67 120 55 69 121 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 53 68 119 54 69 120 46 61 115 26 43 102 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 29 45 103 48 63 117 51 66 119 -+49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 49 65 117 48 65 116 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 48 64 117 48 64 117 46 61 115 -+27 44 102 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 34 50 107 46 61 115 -+45 60 114 44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 44 60 114 43 60 114 44 60 114 44 60 114 -+44 60 114 39 55 110 26 43 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 29 45 103 40 56 111 40 56 111 40 56 111 -+39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 -+38 54 110 38 54 110 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 26 44 102 -+34 50 107 35 51 108 35 51 108 35 51 108 35 51 108 34 50 107 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+25 42 101 36 52 108 64 78 127 68 82 130 67 81 129 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+67 81 129 68 82 130 68 82 130 68 82 130 69 83 131 68 82 130 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 68 82 130 68 82 130 -+69 83 131 69 83 131 69 83 131 70 84 131 70 84 131 69 83 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 69 83 130 -+69 83 130 69 83 130 69 83 130 69 83 130 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 71 85 132 -+71 85 132 71 85 132 71 85 132 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 69 83 130 69 83 130 -+69 83 130 69 83 130 69 83 130 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 69 83 131 70 84 131 69 83 131 -+69 83 131 69 83 131 68 82 130 68 82 130 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 68 82 130 69 83 131 69 83 131 68 82 130 -+68 82 130 67 81 129 67 81 129 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 67 81 129 67 81 129 69 83 130 -+54 69 120 27 44 102 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+23 39 99 44 60 114 65 79 128 66 80 129 65 79 128 66 80 129 -+66 80 129 66 80 128 66 80 127 66 80 127 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 65 79 128 66 80 128 -+65 79 128 64 78 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 64 78 127 65 79 128 64 78 127 63 77 126 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 63 77 126 63 77 126 62 76 125 64 78 127 42 57 112 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 40 56 111 -+59 74 124 61 75 125 61 75 125 61 75 125 61 75 125 60 75 125 -+60 75 125 59 75 125 59 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 59 74 124 58 73 123 58 73 123 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 -+59 74 124 57 72 122 58 73 123 58 73 123 58 73 123 58 73 123 -+49 64 117 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 25 42 101 43 59 113 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 55 70 121 56 70 122 55 70 121 -+54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+54 69 120 55 70 121 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 53 68 119 37 53 109 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 101 24 41 100 36 52 108 50 65 118 50 65 118 -+49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+49 65 117 50 65 118 48 65 116 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 48 64 117 49 65 116 48 64 117 38 56 110 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 42 58 112 45 60 114 -+44 59 113 44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 44 60 114 43 60 114 44 60 114 43 59 113 -+44 60 114 34 50 107 24 41 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 32 48 105 40 56 111 39 55 110 40 56 111 -+39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 34 50 107 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 29 46 104 -+34 50 107 35 51 108 35 51 108 35 51 108 35 51 108 34 50 107 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 27 44 102 56 71 121 67 81 129 68 82 130 -+68 82 130 67 81 129 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 67 81 129 68 82 130 68 82 130 -+68 82 130 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 68 82 130 68 82 130 69 83 131 69 83 131 -+69 83 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 69 83 130 69 83 130 -+69 83 130 69 83 130 69 83 130 69 83 130 69 83 130 69 83 130 -+69 83 130 69 83 130 69 83 130 69 83 130 69 83 130 69 83 130 -+69 83 130 69 83 130 69 83 130 69 83 130 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 69 83 131 70 84 131 -+70 84 131 69 83 131 69 83 131 69 83 131 68 82 130 68 82 130 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+68 82 130 69 83 131 69 83 131 68 82 130 67 81 129 67 81 129 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 67 81 129 68 82 130 68 82 130 65 79 128 40 57 112 -+23 39 99 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 -+47 63 116 66 80 129 65 79 128 66 80 128 66 80 129 66 80 129 -+66 80 128 66 80 127 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 65 79 128 66 80 128 66 80 128 64 78 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 64 78 127 65 79 128 64 78 127 63 77 126 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 63 77 126 -+64 78 127 63 77 126 62 76 125 63 77 126 50 65 118 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 29 47 104 57 72 122 -+61 75 125 59 74 124 61 75 125 61 75 125 60 75 125 61 75 125 -+59 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 59 74 124 60 75 125 59 74 124 58 73 123 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+58 73 123 57 72 122 58 73 123 58 73 123 58 73 123 57 72 122 -+31 47 105 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 30 46 104 55 69 121 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 55 70 121 54 70 120 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 -+55 70 121 54 69 120 53 68 119 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 50 65 118 28 45 103 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 26 43 102 44 60 114 51 66 119 49 64 117 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 -+50 65 118 48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 48 63 117 47 63 116 32 50 106 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 29 46 104 44 59 113 45 60 114 -+44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 44 60 114 43 60 114 44 60 114 44 60 114 44 60 114 -+42 58 112 30 46 104 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 36 52 108 40 56 111 40 56 111 39 55 111 -+38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 38 54 110 -+39 55 111 29 46 104 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 42 100 31 47 105 -+35 51 108 35 51 108 35 51 108 35 51 108 34 50 107 34 50 107 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 23 40 99 42 58 112 62 76 125 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 67 81 129 67 81 129 -+68 82 130 69 83 131 69 83 131 68 82 130 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 68 82 130 68 82 130 -+69 83 131 69 83 131 69 83 131 70 84 131 70 84 131 70 84 131 -+69 83 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 69 83 131 -+69 83 131 69 83 131 68 82 130 68 82 130 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 68 82 130 69 83 131 -+69 83 131 68 82 130 68 82 130 67 81 129 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+67 81 129 68 82 130 68 81 130 54 69 120 31 47 105 23 40 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 27 44 102 50 65 118 -+66 80 129 66 80 129 66 80 128 66 80 129 66 80 128 66 80 128 -+66 80 127 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 65 79 128 65 79 128 64 78 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 64 78 127 63 77 126 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 63 77 126 64 78 127 -+63 77 126 62 76 125 63 77 126 55 70 121 28 45 103 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 25 42 101 51 66 119 62 76 125 -+59 74 124 61 75 125 61 75 125 60 75 125 61 75 125 60 75 125 -+59 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 59 74 124 58 73 123 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 -+57 72 122 58 73 123 58 73 123 57 72 122 59 74 124 44 59 113 -+23 40 99 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 43 58 114 57 72 122 55 69 121 56 70 122 -+56 70 122 56 70 122 56 70 122 55 70 121 55 70 121 54 70 120 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+54 69 120 54 69 120 53 68 119 54 69 120 54 69 120 54 69 120 -+53 68 119 54 69 120 40 57 112 23 40 100 25 42 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 31 47 105 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+49 65 117 48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 48 64 117 49 65 117 48 63 117 43 60 114 26 43 102 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 35 51 108 45 60 114 45 60 114 -+44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+44 60 114 45 60 114 43 60 114 44 60 114 44 60 114 44 60 114 -+40 56 111 26 43 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 26 43 101 40 56 111 40 56 111 39 55 111 39 55 111 -+38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 32 50 106 -+35 51 108 35 51 108 35 51 108 35 51 108 35 51 108 34 50 107 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 31 47 105 -+50 65 118 69 83 131 68 82 130 67 81 129 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+67 81 129 68 82 130 68 82 130 69 83 131 69 83 131 68 82 130 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+68 82 130 68 82 130 68 82 130 69 83 131 69 83 131 69 83 131 -+70 84 131 70 84 131 69 83 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 69 83 131 -+70 84 131 70 84 131 69 83 131 69 83 131 69 83 131 68 82 130 -+68 82 130 68 82 130 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 68 82 130 69 83 131 68 82 130 -+68 82 130 67 81 129 67 81 129 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 67 81 129 68 82 130 -+70 84 131 63 77 126 39 55 111 26 43 102 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 23 40 99 30 46 104 56 70 122 66 80 129 -+66 80 129 65 79 128 66 80 129 66 80 128 66 80 128 66 80 127 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 65 79 128 65 79 128 65 79 128 64 78 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+64 78 127 65 79 128 63 77 126 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 63 77 126 -+63 77 126 62 76 125 59 74 124 33 49 106 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 23 40 99 44 60 114 62 76 125 59 74 124 -+61 75 125 61 75 125 61 75 125 61 75 125 60 75 125 59 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+59 74 124 60 75 125 58 73 123 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 58 73 123 58 73 123 58 73 123 -+57 72 122 58 73 123 57 72 122 58 73 123 54 69 120 26 43 102 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 30 46 104 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 55 70 121 56 70 122 54 70 120 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+54 69 120 53 68 119 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 53 68 119 27 44 102 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 101 40 56 111 52 67 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 48 64 117 47 63 116 38 54 110 23 40 100 -+25 42 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 26 43 101 39 55 111 46 61 115 44 59 113 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 44 60 114 43 60 114 44 60 114 44 60 114 43 59 113 -+36 52 108 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 31 47 105 40 56 111 39 55 110 40 56 111 39 55 111 -+38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+35 51 108 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 27 44 102 34 50 107 -+35 51 108 35 51 108 35 51 108 35 51 108 35 51 108 33 49 106 -+25 42 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+25 42 101 35 52 107 63 77 126 69 83 130 68 82 130 67 81 129 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 67 81 129 68 82 130 68 82 130 68 82 130 69 83 131 -+69 83 131 68 82 130 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 68 82 130 68 82 130 69 83 131 -+69 83 131 69 83 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 69 83 131 70 84 131 70 84 131 70 84 131 -+69 83 131 69 83 131 69 83 131 68 82 130 68 82 130 68 82 130 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 68 82 130 69 83 131 69 83 131 68 82 130 68 82 130 -+67 81 129 67 81 129 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+50 65 118 27 44 103 25 42 101 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 23 40 99 34 50 107 63 77 126 66 80 129 66 80 129 -+65 79 128 66 80 128 66 80 128 66 80 127 66 80 127 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+65 79 128 66 80 128 65 79 128 64 78 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 64 78 127 -+65 79 128 64 78 127 63 77 126 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 63 77 126 62 76 125 -+62 76 125 64 78 127 36 52 108 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 23 40 100 36 52 108 59 74 124 61 75 125 59 74 124 -+61 75 125 61 75 125 60 75 125 61 75 125 60 75 125 59 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 -+60 75 125 59 74 124 58 73 123 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 57 72 122 -+58 73 123 58 73 123 58 73 123 59 74 124 35 51 108 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+23 40 99 49 63 116 56 70 122 55 69 121 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 55 70 121 54 70 120 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 -+54 69 120 53 68 119 54 69 120 54 69 120 54 69 120 53 68 119 -+54 69 120 40 57 112 23 40 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 26 43 101 51 66 119 50 65 118 49 64 117 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 50 65 118 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+48 64 117 49 65 117 48 64 116 47 63 116 29 45 103 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 28 45 103 44 60 114 46 61 115 44 59 113 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 43 60 114 44 60 114 44 60 114 44 60 114 43 59 113 -+29 46 104 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 37 53 109 40 56 111 40 56 111 40 56 111 38 54 111 -+39 55 111 39 55 111 39 55 111 39 55 111 38 54 110 39 55 111 -+30 46 104 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 28 45 103 35 51 108 -+35 51 108 35 51 108 35 51 108 35 51 108 35 51 108 33 49 106 -+57 72 122 28 45 103 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 25 42 100 48 64 117 65 79 128 68 82 130 -+68 82 130 67 81 129 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 67 81 129 67 81 129 -+68 82 130 68 82 130 68 82 130 69 83 131 68 82 130 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 68 82 130 68 82 130 68 82 130 69 83 131 -+69 83 131 69 83 131 69 83 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 69 83 131 70 84 131 70 84 131 70 84 131 70 84 131 -+69 83 131 69 83 131 69 83 131 68 82 130 68 82 130 68 82 130 -+68 82 130 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 68 82 130 69 83 131 69 83 131 -+68 82 130 68 82 130 68 82 130 67 81 129 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+67 81 129 68 82 130 68 82 130 67 81 129 63 77 126 37 53 109 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+25 42 101 40 56 111 64 78 128 66 80 129 66 80 129 66 80 128 -+66 80 129 66 80 128 66 80 127 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 65 79 128 66 80 128 -+66 80 128 64 78 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+64 78 127 63 77 126 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 63 77 126 64 78 127 63 77 126 63 77 126 -+63 77 126 42 58 112 23 40 99 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 29 46 103 56 71 121 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 60 75 125 59 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 60 75 125 -+59 74 124 58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 58 73 123 57 72 122 58 73 123 -+58 73 123 58 73 123 58 73 123 48 63 117 26 43 102 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 100 24 41 100 -+34 50 107 56 70 122 55 69 121 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 55 70 121 54 70 120 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 -+53 68 119 54 69 120 54 69 120 54 69 120 53 67 120 54 69 120 -+54 69 120 26 43 102 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 38 54 110 51 66 119 50 65 118 49 64 117 50 65 118 -+50 65 118 50 65 118 50 65 118 49 65 117 50 65 118 49 65 117 -+48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 48 64 117 48 64 117 43 58 114 23 40 99 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 34 50 106 47 63 116 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+44 60 114 43 60 114 44 60 114 44 60 114 44 60 114 43 59 113 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+26 43 101 40 56 111 39 55 110 39 55 111 40 56 111 38 54 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 110 -+26 43 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 31 47 105 35 51 108 -+35 51 108 35 51 108 35 51 108 35 51 108 34 50 107 33 49 106 -+66 80 129 60 75 125 36 52 108 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 23 40 99 34 50 107 55 69 121 -+66 80 129 69 83 130 68 82 130 67 81 129 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+67 81 129 67 81 129 68 82 130 68 82 130 69 83 131 69 83 131 -+68 82 130 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 68 82 130 -+68 82 130 68 82 130 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+69 83 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 69 83 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 69 83 131 69 83 131 69 83 131 69 83 131 -+68 82 130 68 82 130 68 82 130 68 82 130 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 68 82 130 68 82 130 -+67 81 129 67 81 129 67 81 129 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 67 81 129 -+68 82 130 68 82 130 62 76 125 46 61 115 25 43 102 23 40 99 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 23 40 100 27 44 102 -+46 61 115 66 80 129 66 80 129 65 79 128 66 80 129 66 80 129 -+66 80 128 66 80 127 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 65 79 128 -+65 79 128 64 78 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 64 78 127 64 78 127 64 78 127 -+63 77 126 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 63 77 126 64 78 127 63 77 126 62 76 125 63 77 126 -+46 61 115 23 40 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 48 63 117 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 60 75 125 60 75 125 59 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 -+59 74 124 58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 58 73 123 59 74 124 57 72 122 58 73 123 58 73 123 -+58 73 123 57 72 122 56 71 121 34 50 106 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 -+49 64 117 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+55 70 121 56 70 122 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 54 69 120 55 70 121 53 68 119 -+54 69 120 54 69 120 54 69 120 54 69 120 53 68 119 55 70 121 -+40 56 111 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+25 42 101 50 65 118 50 65 118 49 64 117 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 49 65 117 -+48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 -+49 65 117 48 64 116 49 64 117 31 47 105 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 42 57 112 46 61 115 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 45 60 114 -+44 60 114 44 60 114 44 60 114 43 60 114 44 60 114 35 51 108 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+31 47 105 40 56 111 40 56 111 40 56 111 39 55 111 38 54 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 35 51 108 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 34 50 107 35 51 108 -+35 51 108 35 51 108 35 51 108 35 51 108 34 50 107 33 49 106 -+66 80 129 66 80 129 63 77 126 46 61 115 23 40 99 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 23 40 100 25 42 101 -+37 53 109 56 71 121 69 83 131 68 82 130 67 81 129 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 67 81 129 67 81 129 68 82 130 68 82 130 -+69 83 131 69 83 131 68 82 130 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 69 83 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 70 84 131 -+70 84 131 70 84 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 68 82 130 68 82 130 68 82 130 68 82 130 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 68 82 130 -+69 83 131 69 83 131 68 82 130 68 82 130 68 82 130 67 81 129 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 67 81 129 67 81 129 69 83 130 -+67 81 129 47 63 116 31 47 105 23 40 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 23 40 99 32 50 106 56 70 122 -+67 81 129 66 80 129 65 79 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 127 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 65 79 128 65 79 128 65 79 128 -+64 78 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 64 78 127 65 79 128 64 78 127 63 77 126 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+63 77 126 64 78 127 63 77 126 62 76 125 63 77 126 50 65 118 -+26 43 102 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+39 55 111 61 75 125 61 75 125 59 74 124 61 75 125 61 75 125 -+60 75 125 61 75 125 60 75 125 59 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 59 74 124 -+58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+58 73 123 59 74 124 58 73 123 58 73 123 58 73 123 58 73 123 -+57 72 122 58 73 123 45 60 114 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 36 52 108 -+55 69 121 55 69 121 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 53 68 119 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 51 66 119 -+29 46 103 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 23 40 100 -+37 53 109 51 66 119 50 65 118 49 64 117 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 48 65 116 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+48 64 117 48 64 117 45 60 114 25 42 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 28 45 103 46 61 115 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 44 60 113 44 60 114 27 44 102 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+36 52 108 40 56 111 40 56 111 40 56 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 38 54 110 39 55 111 32 48 107 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 26 43 102 35 51 108 35 52 107 -+35 51 108 35 51 108 34 50 107 35 51 108 34 50 107 33 49 106 -+66 80 129 65 79 128 66 80 129 65 79 128 56 70 122 27 44 102 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 26 43 102 38 56 110 64 78 127 69 83 130 68 82 130 -+67 81 129 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 67 81 129 68 82 130 -+68 82 130 68 82 130 69 83 131 69 83 131 69 83 131 68 82 130 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+70 84 131 70 84 131 70 84 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 68 82 130 69 83 131 69 83 131 -+68 82 130 68 82 130 68 82 130 67 81 129 67 81 129 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 67 81 129 68 82 130 70 84 131 53 68 119 -+29 46 103 25 42 101 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 39 55 111 62 76 125 66 80 129 -+66 80 129 65 79 128 66 80 128 66 80 129 66 80 128 66 80 127 -+66 80 127 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 65 79 128 66 80 128 65 79 128 64 78 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 64 78 127 65 79 128 64 78 127 63 77 126 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 63 77 126 62 76 125 63 77 126 56 71 121 27 44 102 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 32 48 105 -+61 75 125 61 75 125 59 74 124 61 75 125 61 75 125 60 75 125 -+61 75 125 60 75 125 59 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 59 74 124 59 74 124 58 73 123 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 58 73 123 57 72 122 57 72 122 58 73 123 58 73 123 -+58 73 123 56 71 121 25 42 101 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 27 44 102 49 64 117 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 55 70 121 -+56 70 122 55 70 121 54 70 120 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 54 69 120 55 70 121 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 55 68 119 54 69 120 40 57 112 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 -+47 63 116 50 65 118 49 64 117 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 49 65 117 48 65 116 48 65 116 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+48 64 116 49 65 117 34 50 107 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 37 53 109 46 61 115 45 60 114 44 59 113 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 -+43 60 114 44 60 114 44 60 114 44 60 114 39 55 111 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 26 43 102 -+38 54 110 39 55 110 39 55 111 40 56 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 38 54 110 29 46 103 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 30 46 104 35 51 108 34 50 108 -+35 51 108 35 51 108 35 51 108 34 50 107 34 50 107 31 47 105 -+66 80 129 66 80 129 66 80 128 65 79 128 66 80 129 61 75 125 -+34 50 108 25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 44 60 114 64 78 127 -+67 81 129 68 82 130 68 82 130 67 81 129 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 67 81 129 67 81 129 68 82 130 68 82 130 -+68 82 130 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 68 82 130 -+69 83 131 69 83 131 68 82 130 68 82 130 67 81 129 67 81 129 -+67 81 129 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 67 81 129 67 81 129 -+68 82 130 68 82 130 66 80 129 58 73 123 32 48 107 23 40 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 26 43 102 46 61 115 67 81 129 66 80 129 65 79 128 -+66 80 129 66 80 129 66 80 129 66 80 127 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+65 79 128 66 80 128 66 80 128 64 78 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 64 78 127 63 77 126 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 63 77 126 64 78 127 -+63 77 126 62 76 125 63 77 126 59 74 124 27 44 103 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 27 44 103 59 72 123 -+61 75 125 61 75 125 61 75 125 61 75 125 60 75 125 61 75 125 -+60 75 125 59 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 59 74 124 58 73 123 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 -+59 74 124 58 73 123 57 72 122 58 73 123 57 72 122 58 73 123 -+59 74 124 34 50 107 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 37 53 109 57 72 122 -+55 69 121 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+55 70 121 54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 54 69 120 55 70 121 54 69 120 53 68 119 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 51 66 119 31 47 105 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 34 50 107 -+50 65 118 50 65 118 49 64 117 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 49 65 117 49 65 117 48 65 116 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 48 64 116 -+48 64 117 46 61 115 27 44 102 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+25 42 101 45 60 114 46 61 115 45 60 114 44 59 113 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 -+43 60 114 44 60 114 44 60 114 44 60 114 32 48 107 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 30 48 104 -+39 55 110 40 56 111 40 56 111 39 55 111 38 54 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 36 52 108 26 43 102 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 33 49 106 35 51 108 35 51 108 -+35 51 108 35 51 108 35 51 108 34 50 107 34 50 107 28 45 103 -+66 80 128 66 80 128 66 80 129 66 80 128 65 79 128 66 80 129 -+65 79 128 44 60 114 28 45 103 23 40 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 23 40 99 27 44 103 -+46 61 115 59 74 124 68 82 130 68 82 130 68 82 130 67 81 129 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 67 81 129 67 81 129 -+68 82 130 68 82 130 68 82 130 69 83 131 69 83 131 69 83 131 -+68 82 130 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+68 82 130 68 82 130 68 82 130 67 81 129 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 67 81 129 68 82 130 69 83 130 -+65 79 128 55 69 121 38 54 109 23 40 100 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+34 50 107 57 72 122 68 82 130 65 79 128 65 79 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 127 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 65 79 128 -+66 80 128 65 79 128 65 79 128 64 78 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 64 78 127 -+64 78 127 64 78 127 63 77 126 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 63 77 126 64 78 127 63 77 126 -+62 76 125 63 77 126 58 73 123 29 47 104 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 26 43 102 51 66 119 61 75 125 -+59 74 124 61 75 125 61 75 125 61 75 125 61 75 125 60 75 125 -+60 75 125 59 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 59 74 124 60 75 125 58 73 123 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+58 73 123 57 72 122 58 73 123 58 73 123 57 72 122 58 73 123 -+46 61 115 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 27 44 102 54 69 120 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 55 70 121 -+55 70 121 54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 54 69 120 54 69 120 53 68 119 54 69 120 -+54 69 120 54 69 120 53 68 119 54 69 120 44 59 113 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 42 58 112 -+51 66 119 49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 49 65 117 48 65 116 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 49 65 117 -+48 64 117 38 56 110 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+33 49 106 46 61 115 45 60 114 44 59 113 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 43 60 114 -+44 60 114 44 60 114 44 60 114 43 59 113 26 43 102 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 35 52 107 -+40 56 111 39 55 111 40 56 111 39 55 111 38 54 111 39 55 111 -+39 55 111 39 55 111 39 55 111 38 54 110 34 50 107 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 25 43 102 35 51 108 34 50 107 35 51 108 -+35 51 108 34 50 107 35 51 108 34 50 107 34 50 107 25 42 101 -+66 80 127 66 80 128 66 80 128 66 80 129 66 80 129 65 79 128 -+66 80 129 67 81 129 56 71 121 36 52 108 23 40 99 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+23 40 100 30 46 104 40 57 112 58 73 123 69 83 131 68 82 130 -+67 81 129 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+67 81 129 67 81 129 67 81 129 68 82 130 68 82 130 68 82 130 -+69 83 131 69 83 131 69 83 131 68 82 130 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 68 82 130 69 83 131 -+69 83 131 69 83 131 68 82 130 68 82 130 68 82 130 68 82 130 -+67 81 129 67 81 129 67 81 129 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 67 81 129 68 82 130 69 83 131 67 81 129 50 65 118 -+36 52 108 25 42 101 23 40 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 46 61 115 -+63 77 126 66 80 129 65 79 128 66 80 129 66 80 128 66 80 129 -+66 80 128 66 80 127 66 80 127 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 65 79 128 66 80 128 -+65 79 128 65 79 128 64 78 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 64 78 127 65 79 128 -+64 78 127 63 77 126 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 63 77 126 64 78 127 63 77 126 62 76 125 -+63 77 126 58 73 123 33 49 106 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 44 60 114 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 60 75 125 60 75 125 60 75 125 -+59 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+59 74 124 60 75 125 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 59 74 124 -+57 72 122 58 73 123 58 73 123 58 73 123 58 73 123 53 67 120 -+29 45 103 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 100 23 40 100 45 60 114 56 70 122 55 69 121 -+56 70 122 56 70 122 56 70 122 56 70 122 55 70 121 56 70 122 -+54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 54 69 120 54 69 120 53 68 119 54 69 120 54 69 120 -+54 69 120 54 69 120 53 67 120 54 69 120 29 46 103 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 100 29 47 104 50 65 118 -+50 65 118 49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 49 65 117 50 65 118 48 65 116 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 -+47 63 116 32 48 107 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+40 57 112 46 61 115 45 60 114 44 59 113 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 43 60 114 -+44 60 114 43 59 113 44 60 114 37 53 109 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 26 44 102 37 53 109 -+40 56 111 40 56 111 39 55 111 39 55 111 38 54 111 39 55 111 -+39 55 111 39 55 111 39 55 111 38 54 110 30 46 104 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 29 46 104 35 51 108 35 51 108 35 51 108 -+35 51 108 35 51 108 34 50 107 34 50 107 32 48 107 24 41 100 -+66 80 128 66 80 127 66 80 127 66 80 128 66 80 129 66 80 128 -+65 79 128 66 80 129 66 80 129 64 78 127 46 61 115 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 25 42 100 26 43 101 36 52 108 58 73 123 -+70 84 131 68 82 130 67 81 129 67 81 129 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 67 81 129 67 81 129 68 82 130 -+68 82 130 68 82 130 68 82 130 69 83 131 69 83 131 69 83 131 -+68 82 130 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 68 82 130 69 83 131 69 83 131 69 83 131 68 82 130 -+68 82 130 68 82 130 68 82 130 67 81 129 67 81 129 67 81 129 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 69 83 130 68 81 130 48 63 117 29 46 104 25 42 101 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 23 40 100 29 47 104 59 74 124 65 79 128 -+66 80 129 66 80 129 66 80 128 66 80 129 66 80 129 66 80 128 -+66 80 127 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 65 79 128 66 80 128 65 79 128 -+64 78 128 64 78 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 64 78 127 65 79 128 64 78 127 -+63 77 126 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 63 77 126 62 76 125 62 76 125 -+61 75 125 35 52 107 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 37 53 109 61 75 125 61 75 125 59 74 124 -+61 75 125 61 75 125 61 75 125 61 75 125 60 75 125 59 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 59 74 124 58 73 123 58 73 123 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 58 73 123 59 74 124 58 73 123 -+57 72 122 58 73 123 58 73 123 57 72 122 57 72 122 38 54 110 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 33 49 106 55 69 121 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 55 70 121 56 70 122 55 70 121 -+54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+54 69 120 55 70 121 53 68 119 54 69 120 54 69 120 54 69 120 -+54 69 120 53 68 119 54 69 120 42 58 112 23 40 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 40 56 111 51 66 119 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 49 65 117 48 65 116 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 48 64 117 49 65 117 48 63 117 -+43 60 114 25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 29 46 104 -+44 60 114 45 60 114 44 59 113 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 44 60 114 43 60 114 43 60 114 -+44 60 114 44 60 114 43 59 113 32 48 105 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 101 29 46 104 40 56 111 -+40 56 111 40 56 111 39 55 111 38 54 111 39 55 111 39 55 111 -+39 55 111 39 55 111 38 54 110 38 54 110 25 42 101 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 32 48 107 35 51 108 35 51 108 35 51 108 -+35 51 108 35 51 108 34 50 107 34 50 107 29 45 103 24 41 100 -+66 80 128 66 80 128 66 80 128 66 80 127 66 80 128 66 80 129 -+66 80 129 66 80 129 65 79 128 66 80 129 68 81 130 58 73 123 -+31 47 105 25 42 101 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 23 40 99 -+33 49 106 56 71 121 65 79 128 67 81 129 68 82 130 68 82 130 -+68 81 130 67 81 129 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 67 81 129 67 81 129 67 81 129 67 81 129 -+68 82 130 68 82 130 68 82 130 68 82 130 69 83 131 69 83 131 -+69 83 131 69 83 131 68 82 130 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 68 82 130 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 68 82 130 -+68 82 130 68 82 130 68 82 130 67 81 129 67 81 129 67 81 129 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 66 80 129 -+63 77 126 46 61 115 26 43 102 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 26 43 101 44 60 114 67 81 129 66 80 129 65 79 128 -+66 80 128 66 80 129 66 80 129 66 80 128 66 80 127 66 80 127 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 65 79 128 64 78 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 64 78 127 64 78 127 64 78 127 64 78 127 63 77 126 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+63 77 126 64 78 127 63 77 126 62 76 125 63 77 126 62 76 125 -+38 54 109 23 40 99 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 101 -+24 41 100 31 47 105 61 75 125 61 75 125 60 75 125 61 75 125 -+61 75 125 60 75 125 61 75 125 60 75 125 59 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 -+60 75 125 59 74 124 58 73 123 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 58 73 123 59 74 124 58 73 123 57 72 122 -+58 73 123 58 73 123 57 72 122 58 73 123 49 65 117 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 25 42 101 49 64 117 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 55 70 121 56 70 122 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 -+55 70 121 53 68 119 54 69 120 54 69 120 54 69 120 54 69 120 -+53 68 119 54 69 120 54 69 120 25 43 102 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 27 44 102 51 66 119 50 65 118 -+49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 48 64 117 49 65 117 48 64 116 47 63 116 -+35 51 108 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 36 52 108 -+46 61 115 45 60 114 44 59 113 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 44 60 114 44 60 114 43 60 114 44 60 114 -+44 60 114 44 60 114 40 57 112 27 44 102 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 34 50 106 40 56 111 -+40 56 111 39 55 111 39 55 111 38 54 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 34 50 108 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 25 42 102 34 50 107 34 50 108 35 51 108 35 51 108 -+35 51 108 34 50 107 34 50 107 34 50 107 26 43 102 24 41 100 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 127 66 80 128 -+66 80 128 66 80 129 66 80 128 66 80 129 65 79 128 66 80 129 -+66 80 129 46 61 115 29 46 104 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 23 39 99 31 47 105 47 63 116 58 73 123 66 80 128 -+69 83 130 68 82 130 67 81 129 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+67 81 129 67 81 129 67 81 129 67 81 129 68 82 130 68 82 130 -+68 82 130 68 82 130 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 68 82 130 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 67 81 129 -+67 81 129 67 81 129 67 81 129 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 67 81 129 -+68 82 130 68 82 130 69 83 130 63 77 126 54 69 120 40 56 111 -+25 42 101 23 39 99 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+36 52 108 56 70 122 68 81 130 66 80 129 66 80 129 66 80 128 -+66 80 129 66 80 128 66 80 128 66 80 127 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+65 79 128 66 80 128 65 79 128 65 79 128 64 78 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+64 78 127 65 79 128 64 78 127 63 77 126 63 77 126 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 63 77 126 -+64 78 127 63 77 126 62 76 125 63 77 126 61 75 125 38 54 109 -+23 39 99 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 23 40 100 -+29 47 104 57 72 122 61 75 125 59 74 124 61 75 125 61 75 125 -+60 75 125 61 75 125 60 75 125 59 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 60 75 125 -+59 74 124 58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 58 73 123 58 73 123 57 72 122 -+58 73 123 57 72 122 58 73 123 55 71 121 29 46 103 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 37 53 109 55 69 121 55 69 121 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+54 69 120 53 68 119 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 55 70 121 38 56 110 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 100 23 40 100 40 57 112 51 66 119 50 65 118 -+49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 -+50 65 118 49 65 117 48 65 116 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 48 64 117 48 64 117 47 63 116 -+25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 27 43 102 40 57 112 -+46 61 115 44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 44 60 114 43 60 114 44 60 114 -+44 60 114 43 59 113 38 54 109 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 25 42 101 38 54 110 40 56 111 -+40 56 111 39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 -+39 55 111 38 54 110 39 55 111 29 46 104 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 28 45 103 34 50 107 35 51 108 35 51 108 35 51 108 -+35 51 108 34 50 107 33 49 106 32 48 107 25 42 101 25 42 101 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 127 -+66 80 127 66 80 128 66 80 129 66 80 129 66 80 128 65 79 128 -+66 80 129 66 80 129 59 74 124 42 57 112 23 40 99 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 23 40 99 27 44 103 36 52 108 -+47 63 116 62 76 125 71 85 132 69 83 130 68 82 130 67 81 129 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 67 81 129 67 81 129 -+67 81 129 67 81 129 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 -+69 83 131 69 83 131 69 83 131 69 83 131 69 83 131 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 67 81 129 67 81 129 67 81 129 67 81 129 67 81 129 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 67 81 129 68 82 130 70 84 131 -+68 82 130 55 71 121 42 57 112 32 50 106 25 42 101 23 40 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 23 40 99 31 47 105 51 66 119 -+64 78 127 67 81 129 66 80 129 65 79 128 66 80 129 66 80 129 -+66 80 128 66 80 127 66 80 127 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 65 79 128 -+66 80 128 65 79 128 65 79 128 64 78 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 64 78 127 -+65 79 128 64 78 127 63 77 126 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 63 77 126 64 78 127 -+63 77 126 62 76 125 63 77 126 61 75 125 37 53 109 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 28 45 103 -+53 67 120 61 75 125 59 74 124 61 75 125 61 75 125 61 75 125 -+61 75 125 60 75 125 60 75 125 59 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 -+58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 58 73 123 58 73 123 58 73 123 57 72 122 58 73 123 -+58 73 123 57 72 122 59 74 124 35 51 108 23 40 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+28 45 102 51 66 119 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 55 70 121 56 70 122 55 70 121 54 70 120 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 55 70 121 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 53 68 119 -+54 69 120 49 65 117 28 45 103 24 41 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 28 45 103 50 65 118 50 65 118 49 64 117 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+49 65 117 49 65 117 48 65 116 49 65 117 49 65 117 49 65 117 -+49 65 117 48 64 117 49 65 117 48 64 116 48 64 117 37 53 109 -+23 40 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 31 47 105 46 61 115 -+45 60 114 44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 44 60 114 45 60 114 43 60 114 44 60 114 44 60 114 -+43 59 113 43 59 113 31 47 105 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 28 45 104 40 56 111 39 55 110 -+39 55 111 40 56 111 38 54 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 38 54 110 25 42 101 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 31 47 105 35 51 108 35 51 108 35 51 108 35 51 108 -+35 51 108 34 50 107 34 50 107 30 46 104 25 42 101 25 42 101 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 127 66 80 128 66 80 128 66 80 129 66 80 128 -+65 79 128 66 80 129 66 80 129 65 79 128 57 72 122 32 50 106 -+23 40 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+25 42 101 27 44 102 34 50 107 52 67 118 67 81 129 69 83 130 -+68 82 130 67 81 129 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 67 81 129 67 81 129 67 81 129 67 81 129 -+67 81 129 67 81 129 67 81 129 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 67 81 129 -+67 81 129 67 81 129 67 81 129 67 81 129 67 81 129 67 81 129 -+67 81 129 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+67 81 129 68 82 130 68 82 130 69 83 131 63 77 126 45 60 114 -+30 46 104 26 43 102 25 42 101 24 41 100 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 44 60 114 63 77 126 66 80 129 -+66 80 129 65 79 128 66 80 129 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 127 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 65 79 128 66 80 128 -+65 79 128 64 78 128 64 78 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 64 78 127 65 79 128 -+64 78 127 63 77 126 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 63 77 126 -+62 76 125 62 76 125 61 75 125 38 54 109 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 26 43 101 48 64 116 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 60 75 125 -+60 75 125 59 75 125 59 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 59 74 124 60 75 125 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 58 73 123 57 72 122 58 73 123 58 73 123 -+57 72 122 59 74 124 44 59 113 25 42 101 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+40 57 112 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 55 70 121 54 70 120 54 70 120 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 -+53 68 119 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 38 56 110 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 101 23 40 99 42 58 112 51 66 119 49 64 117 49 64 117 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+49 65 117 48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 48 64 117 48 64 117 48 64 116 26 43 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 38 54 109 46 61 115 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 44 60 114 43 60 114 44 60 114 44 60 114 -+44 60 114 42 58 112 24 41 101 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 35 52 107 40 56 111 40 56 111 -+40 56 111 39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 33 49 106 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+25 42 101 32 50 106 35 51 108 35 51 108 35 51 108 35 51 108 -+34 50 107 34 50 107 33 49 106 27 44 103 24 41 100 25 42 101 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 127 66 80 128 66 80 128 -+66 80 129 66 80 129 66 80 128 65 79 128 66 80 129 66 80 128 -+47 63 116 28 45 103 25 42 101 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 23 40 99 25 42 101 39 55 111 -+56 71 121 65 79 128 66 80 129 67 81 129 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 67 81 129 68 82 130 68 82 130 68 82 130 67 81 129 -+65 79 128 63 77 126 49 64 117 32 48 105 23 39 99 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+25 42 101 34 50 107 59 74 124 68 81 130 66 80 129 65 79 128 -+66 80 128 66 80 129 66 80 128 66 80 128 66 80 127 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 65 79 128 66 80 128 65 79 128 65 79 128 -+64 78 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 64 78 127 65 79 128 64 78 127 -+63 77 126 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 63 77 126 64 78 127 63 77 126 62 76 125 -+63 77 126 61 75 125 38 56 110 23 40 99 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 25 42 101 43 58 114 63 77 126 -+59 74 124 61 75 125 61 75 125 61 75 125 60 75 125 61 75 125 -+59 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 58 73 123 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 -+59 74 124 58 73 123 57 72 122 58 73 123 58 73 123 58 73 123 -+58 73 123 53 68 119 28 45 103 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 29 46 104 -+57 72 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+55 70 121 56 70 122 55 70 121 54 70 120 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 -+53 68 119 54 69 120 54 69 120 54 69 120 54 69 120 53 68 119 -+49 64 117 27 44 103 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 30 46 104 48 63 117 50 65 118 49 64 117 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 -+48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 48 64 117 48 64 117 37 53 109 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 25 42 101 46 61 115 46 61 115 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+44 60 114 45 60 114 44 60 114 44 60 114 44 60 114 43 59 113 -+44 60 114 34 50 107 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 25 42 101 40 56 111 39 55 110 39 55 111 -+40 56 111 38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 28 45 103 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+27 44 102 34 50 107 35 51 108 35 51 108 35 51 108 35 51 108 -+35 51 108 33 49 106 33 49 106 27 43 102 24 41 100 25 42 101 -+66 80 128 65 79 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 127 66 80 127 -+66 80 128 66 80 128 66 80 129 66 80 128 65 79 128 66 80 129 -+68 82 130 62 76 125 42 58 112 29 46 104 23 40 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 23 40 100 -+23 39 99 27 44 102 39 55 110 50 65 118 57 72 122 63 77 126 -+68 82 130 69 83 130 68 82 130 68 82 130 68 82 130 67 81 129 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+69 83 130 69 83 131 66 80 128 60 75 125 55 69 121 46 61 115 -+34 50 107 23 40 100 23 39 99 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 42 100 35 52 107 -+51 66 119 68 81 130 66 80 129 65 79 128 66 80 129 66 80 128 -+66 80 129 66 80 128 66 80 128 66 80 127 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 65 79 128 66 80 128 65 79 128 64 78 128 64 78 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 64 78 127 65 79 128 65 79 128 64 78 127 63 77 126 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 63 77 126 64 78 127 63 77 126 62 76 125 63 77 126 -+59 74 124 37 53 109 23 39 99 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 40 56 111 63 77 126 59 74 124 -+61 75 125 61 75 125 61 75 125 60 75 125 61 75 125 60 75 125 -+59 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 59 74 124 59 74 124 59 74 124 58 73 123 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 59 74 124 -+58 73 123 57 72 122 58 73 123 58 73 123 58 73 123 57 72 122 -+57 72 122 36 52 108 24 41 100 25 42 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 50 65 118 -+56 70 122 55 69 121 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 55 70 121 54 70 120 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 54 69 120 54 69 120 53 68 119 -+54 69 120 54 69 120 54 69 120 54 69 120 53 68 119 54 69 120 -+37 53 109 23 40 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 101 39 55 110 51 66 119 49 64 117 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 50 65 118 -+48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 48 64 117 48 64 117 47 63 116 27 44 103 25 42 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 35 51 108 46 61 115 45 60 114 -+44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+44 60 113 26 43 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 31 47 105 40 56 111 40 56 111 40 56 111 -+39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 37 53 109 25 43 102 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+29 46 104 35 51 108 34 50 107 35 51 108 35 51 108 34 50 107 -+35 51 108 33 49 106 31 47 105 25 42 101 24 41 100 25 42 101 -+65 79 128 66 80 128 65 79 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 127 66 80 128 66 80 128 66 80 129 66 80 128 66 80 129 -+65 79 128 66 80 129 67 80 128 59 74 124 44 60 114 26 43 101 -+23 40 99 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 23 40 100 23 40 99 27 44 102 33 49 106 -+38 54 110 47 63 116 57 72 122 66 80 129 70 84 131 69 83 131 -+69 83 130 68 82 130 68 82 130 68 81 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 69 83 130 70 84 131 70 84 131 62 76 125 -+53 68 119 43 59 113 36 52 108 31 47 105 25 42 100 23 40 100 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 23 39 99 34 50 107 52 67 118 63 77 126 -+67 80 128 66 80 129 65 79 128 66 80 128 66 80 129 66 80 129 -+66 80 128 66 80 128 66 80 127 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 65 79 128 64 78 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+64 78 127 65 79 128 64 78 127 64 78 127 63 77 126 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+63 77 126 64 78 127 63 77 126 62 76 125 63 77 126 58 73 123 -+35 52 107 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 23 40 100 40 57 112 59 74 124 61 75 125 59 74 124 -+61 75 125 61 75 125 60 75 125 61 75 125 60 75 125 59 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 59 74 124 58 73 123 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 -+58 73 123 57 72 122 58 73 123 58 73 123 57 72 122 58 73 123 -+43 60 114 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 101 23 40 99 40 57 112 56 70 122 -+55 69 121 56 70 122 56 70 122 56 70 122 56 70 122 55 70 121 -+56 70 122 54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 54 69 120 55 70 121 53 68 119 54 69 120 -+54 69 120 54 69 120 54 69 120 53 67 120 54 69 120 49 63 116 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+27 44 103 48 63 117 50 65 118 49 64 117 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 -+48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+48 64 117 49 65 116 48 64 117 39 55 111 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 25 42 100 44 60 114 45 60 114 45 60 114 -+44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 -+45 60 114 44 60 114 43 60 114 44 60 114 43 60 114 44 60 114 -+37 53 109 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 37 53 109 40 56 111 40 56 111 40 56 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 38 54 110 -+39 55 111 32 50 106 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+32 48 107 35 51 108 35 51 108 35 51 108 35 51 108 35 51 108 -+34 50 107 33 49 106 29 46 104 24 41 100 25 42 101 25 42 101 -+64 78 128 65 79 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 127 66 80 128 66 80 128 66 80 129 66 80 129 -+66 80 128 66 80 129 66 80 129 66 80 129 65 79 128 63 77 126 -+42 58 112 24 41 100 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 101 24 41 100 24 41 100 -+24 41 100 25 42 101 26 43 102 27 44 103 34 50 107 45 60 114 -+55 70 121 65 79 128 69 83 131 69 83 130 68 82 130 68 82 130 -+68 82 130 67 81 129 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 67 81 129 68 82 130 68 82 130 68 82 130 69 83 131 -+69 83 131 61 75 125 50 65 118 39 55 111 29 46 103 27 44 102 -+26 43 101 25 42 101 24 41 100 24 41 100 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+23 40 100 29 46 104 53 67 120 64 78 127 66 80 129 66 80 129 -+65 79 128 65 79 128 66 80 129 66 80 129 66 80 128 66 80 128 -+66 80 127 66 80 127 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 65 79 128 -+65 79 128 65 79 128 65 79 128 64 78 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 64 78 127 63 77 126 63 77 126 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 63 77 126 62 76 125 63 77 126 60 75 125 33 49 106 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 37 53 109 59 74 124 61 75 125 59 74 124 61 75 125 -+61 75 125 61 75 125 61 75 125 60 75 125 59 75 125 59 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+59 74 124 60 75 125 58 73 123 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 -+57 72 122 58 73 123 58 73 123 57 72 122 58 73 123 53 68 119 -+25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 32 48 107 53 67 120 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 55 70 121 56 70 122 -+55 70 121 54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 54 69 120 53 68 119 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 55 70 121 29 47 104 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+38 54 110 51 66 119 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 49 65 117 50 65 118 48 65 116 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 48 64 117 47 63 116 31 47 105 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 33 49 106 46 61 115 45 60 114 44 59 113 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+44 60 114 43 60 114 43 60 114 44 60 114 44 60 113 44 60 114 -+29 46 104 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 28 45 103 38 56 110 39 55 110 39 55 111 40 56 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+38 54 110 29 46 104 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+35 51 108 35 51 108 35 51 108 35 51 108 35 51 108 35 51 108 -+34 50 107 33 49 106 26 43 102 24 41 100 25 42 101 25 42 101 -+65 79 128 64 78 128 64 78 128 65 79 128 66 80 128 66 80 128 -+65 79 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 127 66 80 128 -+66 80 129 66 80 129 66 80 128 66 80 129 65 79 128 66 80 129 -+66 80 129 61 75 125 38 54 110 27 44 102 25 42 101 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 24 41 100 -+23 40 100 23 40 99 28 45 103 37 53 109 47 63 116 55 70 121 -+63 77 126 65 79 128 65 79 128 66 80 128 66 81 129 67 81 129 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 68 82 130 -+68 82 130 68 82 130 67 81 129 67 81 129 66 80 129 66 80 128 -+65 79 128 64 79 127 59 74 124 51 67 118 42 58 112 34 50 106 -+25 42 101 23 40 99 23 40 100 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 25 42 101 29 46 103 -+49 64 117 66 80 129 66 80 129 66 80 129 66 80 129 66 80 128 -+66 80 129 66 80 129 66 80 128 66 80 127 66 80 127 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 65 79 128 66 80 128 65 79 128 65 79 128 -+64 78 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 64 78 127 65 79 128 65 79 128 -+64 78 127 63 77 126 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 63 77 126 64 78 127 64 78 127 -+63 77 126 62 76 125 63 77 126 59 74 124 30 46 104 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+32 50 106 58 73 123 61 75 125 59 74 124 61 75 125 61 75 125 -+60 75 125 61 75 125 60 75 125 59 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 60 75 125 -+60 75 125 58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 58 73 123 59 74 124 58 73 123 57 72 122 -+58 73 123 58 73 123 57 72 122 58 73 123 57 72 122 27 44 103 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 26 43 101 46 61 115 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 55 70 121 56 70 122 55 70 121 -+54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+54 69 120 55 70 121 54 69 120 53 68 119 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 42 58 112 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 27 44 102 -+50 65 118 50 65 118 49 64 117 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 49 65 117 50 65 118 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+48 64 117 48 63 117 43 59 113 25 42 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 42 57 112 46 61 115 45 60 114 44 59 113 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+44 60 114 43 60 114 44 60 114 43 59 113 44 60 114 40 56 111 -+26 43 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 32 50 106 39 55 111 39 55 111 40 56 111 39 55 111 -+38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+37 53 109 26 43 102 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 28 45 103 -+35 51 108 35 51 108 35 51 108 35 51 108 35 51 108 35 51 108 -+34 50 107 33 49 106 24 41 101 24 41 100 25 42 101 25 42 101 -+65 79 128 65 79 128 65 79 128 64 78 128 65 79 128 65 79 128 -+66 80 128 65 79 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 127 -+66 80 128 66 80 128 66 80 129 66 80 129 66 80 128 66 80 129 -+66 80 129 66 80 129 68 82 130 58 73 123 40 57 112 29 47 104 -+24 41 100 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 100 24 41 100 23 40 100 23 40 99 23 39 99 -+23 39 99 27 44 102 32 50 106 37 53 109 42 58 112 47 63 116 -+51 66 119 54 69 120 56 71 121 57 72 122 59 74 124 60 75 125 -+62 76 125 63 77 126 64 78 127 64 78 127 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 64 78 128 64 78 127 -+63 77 126 63 77 126 61 75 125 59 74 124 58 73 123 57 72 122 -+55 70 121 53 68 119 49 64 117 45 60 114 40 56 111 35 51 108 -+30 46 104 24 41 100 22 39 98 23 39 99 23 40 100 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 23 40 100 26 43 101 35 51 108 49 65 117 66 80 129 -+68 81 130 66 80 129 65 79 128 66 80 129 66 80 129 66 80 129 -+66 80 128 66 80 128 66 80 127 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 65 79 128 66 80 128 65 79 128 65 79 128 64 78 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 64 78 127 65 79 128 64 78 127 64 78 127 -+63 77 126 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 63 77 126 64 78 127 63 77 126 63 77 126 -+62 76 125 63 77 126 54 69 120 29 45 103 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 23 40 100 33 49 106 -+58 73 123 61 75 125 59 74 124 61 75 125 61 75 125 61 75 125 -+61 75 125 60 75 125 59 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 -+59 74 124 58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 58 73 123 57 72 122 58 73 123 -+58 73 123 58 73 123 58 73 123 57 72 122 36 52 108 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 36 52 108 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 55 70 121 55 70 121 -+54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 53 68 119 54 69 120 51 66 119 29 45 103 24 41 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 100 23 40 100 40 56 111 -+51 66 119 50 65 118 49 64 117 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 49 65 117 -+48 64 116 48 64 117 33 49 106 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 31 47 105 44 60 114 46 61 115 44 59 113 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 -+44 60 114 43 60 114 44 60 114 44 60 114 44 60 114 34 50 107 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+25 42 101 36 52 108 40 56 111 40 56 111 39 55 111 39 55 111 -+38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 38 54 110 -+34 50 107 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 32 48 107 -+35 51 108 35 51 108 35 51 108 35 51 108 35 51 108 34 50 107 -+34 50 107 30 46 104 24 41 100 25 42 101 25 42 101 25 42 101 -+65 79 128 65 79 128 65 79 128 65 79 128 64 78 128 65 79 128 -+65 79 128 66 80 128 65 79 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 127 66 80 127 66 80 128 66 80 128 66 80 129 66 80 129 -+66 80 129 65 79 128 65 79 128 66 80 129 67 81 129 59 74 124 -+49 64 117 33 49 106 23 39 99 23 40 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 24 41 100 24 41 100 23 40 100 23 40 99 -+23 40 99 24 41 100 25 42 101 27 44 102 29 46 104 29 47 104 -+32 48 105 33 49 106 34 50 106 34 50 107 35 52 107 35 51 108 -+35 51 108 36 52 108 35 51 108 35 52 107 34 50 107 34 50 107 -+33 49 106 32 50 106 31 47 105 30 46 104 28 45 103 27 43 102 -+25 42 101 23 40 99 23 40 99 23 40 100 23 40 100 24 41 100 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 23 40 99 -+26 43 102 40 57 112 55 70 121 63 77 126 67 81 129 66 80 129 -+65 79 128 66 80 129 66 80 128 66 80 129 66 80 128 66 80 128 -+66 80 128 66 80 127 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+65 79 128 66 80 128 65 79 128 65 79 128 64 78 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 64 78 127 64 78 127 63 77 126 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 63 77 126 63 77 126 62 76 125 -+63 77 126 50 65 118 28 45 103 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 23 40 99 33 49 106 57 72 122 -+61 75 125 59 74 124 61 75 125 61 75 125 61 75 125 60 75 125 -+61 75 125 59 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 59 74 124 59 74 124 59 74 124 -+58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 58 73 123 59 74 124 57 72 122 58 73 123 58 73 123 -+58 73 123 57 72 122 58 73 123 43 60 114 25 42 101 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 28 45 103 55 69 121 56 70 122 55 69 121 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 55 70 121 54 70 120 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 -+55 70 121 54 69 120 53 68 119 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 55 68 119 39 55 110 24 41 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 29 46 104 50 65 118 -+50 65 118 49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 49 65 117 50 65 118 49 65 117 48 65 116 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 -+48 64 117 44 60 114 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+25 42 101 37 53 109 46 61 115 45 60 114 44 59 113 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 45 60 114 -+43 60 114 44 60 114 44 60 114 44 60 114 42 58 112 29 45 103 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+27 44 103 39 55 110 40 56 111 40 56 111 39 55 111 38 54 111 -+39 55 111 39 55 111 39 55 111 39 55 111 38 54 111 38 54 110 -+29 46 104 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 35 51 108 -+35 52 107 35 51 108 35 51 108 34 50 107 35 51 108 34 50 107 -+34 50 107 26 43 102 24 41 100 25 42 101 25 42 101 25 42 101 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 64 78 128 -+65 79 128 65 79 128 66 80 128 65 79 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 127 66 80 128 66 80 128 66 80 128 -+66 80 129 66 80 128 66 80 129 66 80 129 66 80 129 66 80 129 -+65 79 128 64 78 127 57 72 122 36 52 108 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 -+24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 -+24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 -+24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 23 40 100 26 43 101 46 61 115 -+61 75 125 65 79 128 66 80 129 66 80 129 66 80 128 65 79 128 -+66 80 128 66 80 129 66 80 129 66 80 128 66 80 128 66 80 127 -+66 80 127 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 65 79 128 66 80 128 -+66 80 128 65 79 128 64 78 128 64 78 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+64 78 127 65 79 128 64 78 127 63 77 126 63 77 126 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 63 77 126 63 77 126 62 76 125 62 76 125 63 77 126 -+48 63 117 25 42 101 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 32 48 105 56 70 122 61 75 125 -+59 74 124 61 75 125 61 75 125 61 75 125 60 75 125 61 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 58 73 123 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+58 73 123 59 74 124 58 73 123 58 73 123 58 73 123 58 73 123 -+58 73 123 58 73 123 52 67 118 26 43 102 24 41 100 25 42 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+23 40 100 49 64 117 56 70 122 55 69 121 56 70 122 56 70 122 -+56 70 122 56 70 122 55 70 121 56 70 122 54 70 120 54 70 120 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+54 69 120 53 68 119 53 68 119 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 50 65 118 27 44 102 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 23 40 100 43 60 114 51 66 119 -+49 64 117 49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 49 65 117 48 65 116 48 65 116 49 65 117 -+49 65 117 49 65 117 49 65 117 48 64 117 49 65 117 48 64 116 -+49 65 117 31 47 105 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+28 45 103 43 59 113 46 61 115 44 59 113 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 -+43 60 114 44 60 114 44 60 114 44 60 113 39 55 110 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+32 48 105 40 56 111 40 56 111 40 56 111 39 55 111 38 54 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 110 37 53 109 -+25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 29 46 104 35 51 108 -+34 50 108 35 51 108 35 51 108 35 51 108 34 50 107 34 50 107 -+32 48 107 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 66 80 128 -+65 79 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 127 -+66 80 128 66 80 128 66 80 128 66 80 129 66 80 129 66 80 128 -+66 80 129 65 79 128 66 80 129 68 81 130 60 75 125 40 57 112 -+27 44 102 25 42 101 24 41 100 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+25 42 101 26 43 101 32 48 105 50 65 118 67 80 128 66 80 129 -+66 80 129 65 79 128 66 80 129 66 80 128 66 80 129 66 80 129 -+66 80 128 66 80 128 66 80 127 66 80 127 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 65 79 128 66 80 128 65 79 128 65 79 128 -+64 78 128 64 78 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 63 77 126 63 77 126 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 63 77 126 64 78 127 -+64 78 127 63 77 126 62 76 125 63 77 126 62 76 125 44 59 113 -+23 39 99 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 30 46 104 55 70 121 61 75 125 59 74 124 -+61 75 125 61 75 125 61 75 125 60 75 125 61 75 125 60 75 125 -+59 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 59 74 124 60 75 125 59 74 124 58 73 123 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 -+59 74 124 58 73 123 57 72 122 58 73 123 58 73 123 57 72 122 -+58 73 123 56 71 121 29 46 104 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+39 55 111 56 70 122 55 69 121 56 70 122 56 70 122 56 70 122 -+56 70 122 55 70 121 56 70 122 54 70 120 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 55 70 121 -+54 69 120 53 68 119 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 53 68 119 36 52 108 23 40 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 31 47 105 49 64 117 50 65 118 -+49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 49 65 117 49 65 117 48 65 116 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 48 64 116 48 64 117 -+43 59 113 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+34 50 106 47 63 116 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 43 60 114 -+44 60 114 44 60 114 43 59 113 43 59 113 31 47 105 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 -+38 54 109 40 56 111 40 56 111 39 55 111 38 54 111 39 55 111 -+39 55 111 39 55 111 39 55 111 38 54 110 39 55 111 32 48 107 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 33 49 106 35 52 107 -+35 51 108 35 51 108 35 51 108 35 51 108 34 50 107 34 50 107 -+29 46 104 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 64 78 128 64 78 128 65 79 128 65 79 128 -+66 80 128 65 79 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 127 66 80 127 66 80 128 66 80 128 66 80 128 66 80 129 -+66 80 129 66 80 128 65 79 128 65 79 128 66 80 129 68 81 130 -+64 78 128 49 64 117 37 53 109 30 46 104 24 41 100 23 40 100 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 23 40 100 26 43 102 34 50 106 -+42 58 112 56 71 121 67 81 129 67 81 129 66 80 129 65 79 128 -+66 80 129 66 80 128 66 80 129 66 80 129 66 80 128 66 80 128 -+66 80 127 66 80 127 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+65 79 128 66 80 128 66 80 128 65 79 128 64 78 128 64 78 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 64 78 127 64 78 127 64 78 127 -+64 78 127 63 77 126 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 63 77 126 -+63 77 126 62 76 125 63 77 126 59 74 124 37 53 109 23 40 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+23 40 100 31 47 105 55 69 121 62 76 125 59 74 124 61 75 125 -+61 75 125 61 75 125 60 75 125 61 75 125 60 75 125 59 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+59 74 124 60 75 125 59 74 124 58 73 123 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+58 73 123 57 72 122 58 73 123 58 73 123 57 72 122 58 73 123 -+57 72 122 35 52 107 23 40 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 31 47 105 -+54 69 120 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+55 70 121 56 70 122 55 70 121 54 70 120 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 -+53 68 119 54 69 120 54 69 120 54 69 120 54 69 120 53 68 119 -+54 69 120 47 63 116 23 40 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 25 42 101 42 57 112 51 66 119 49 64 117 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+49 65 117 50 65 118 48 65 116 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 48 64 117 48 64 117 48 64 117 -+31 47 105 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 100 25 42 101 -+42 58 112 46 61 115 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 42 58 112 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 28 45 103 -+40 57 112 39 55 110 39 55 111 40 56 111 38 54 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 26 43 102 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 27 43 102 34 50 107 34 50 108 -+35 51 108 35 51 108 35 51 108 34 50 107 34 50 107 34 50 107 -+26 43 102 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 64 78 128 64 78 128 -+65 79 128 66 80 128 66 80 128 65 79 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 127 66 80 127 66 80 127 66 80 128 -+66 80 128 66 80 129 66 80 128 66 80 129 66 80 129 65 79 128 -+66 80 129 67 81 129 65 79 128 58 73 123 51 66 119 38 54 110 -+25 42 102 23 39 99 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 100 24 41 100 -+23 40 99 23 39 99 31 47 105 44 60 114 55 69 121 62 76 125 -+67 81 129 66 80 129 66 80 129 65 79 128 66 80 129 66 80 128 -+66 80 129 66 80 129 66 80 128 66 80 128 66 80 128 66 80 127 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 65 79 128 -+66 80 128 65 79 128 65 79 128 64 78 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 64 78 127 65 79 128 65 79 128 64 78 127 63 77 126 -+63 77 126 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 63 77 126 63 77 126 63 77 126 -+62 76 125 63 77 126 56 71 121 32 50 106 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 23 40 99 -+32 50 106 55 70 121 61 75 125 59 74 124 61 75 125 61 75 125 -+61 75 125 60 75 125 61 75 125 60 75 125 59 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 59 74 124 59 74 124 58 73 123 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 59 74 124 -+57 72 122 58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 -+39 55 111 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 26 43 102 47 63 116 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 54 69 120 55 70 121 53 68 119 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+53 68 119 28 45 103 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 31 47 105 50 65 118 50 65 118 49 64 117 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 -+50 65 118 49 65 117 48 65 116 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 48 64 117 49 65 116 48 64 117 42 57 112 -+26 43 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 32 48 105 -+46 61 115 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 44 60 114 45 60 114 44 60 114 44 60 114 -+44 60 114 43 59 113 44 60 114 34 50 106 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 36 52 108 -+40 56 111 40 56 111 40 56 111 39 55 111 38 54 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 36 52 108 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 29 46 104 34 50 107 35 51 108 -+35 51 108 35 51 108 35 51 108 34 50 107 34 50 106 32 48 105 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+65 79 128 64 78 127 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 66 80 128 65 79 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 127 66 80 127 -+66 80 128 66 80 128 66 80 129 66 80 129 66 80 129 66 80 128 -+66 80 129 65 79 128 66 80 129 66 80 129 66 80 129 64 78 128 -+63 77 126 52 67 118 35 51 108 24 41 100 23 40 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 23 40 100 27 44 103 -+43 59 113 59 74 124 64 78 127 65 79 128 66 80 129 66 80 129 -+66 80 129 65 79 128 66 80 129 66 80 128 66 80 129 66 80 129 -+66 80 128 66 80 128 66 80 127 66 80 127 66 80 127 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 65 79 128 66 80 128 66 80 128 -+65 79 128 65 79 128 64 78 128 64 78 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+64 78 127 65 79 128 64 78 127 64 78 127 63 77 126 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 63 77 126 64 78 127 63 77 126 62 76 125 -+64 78 127 52 66 118 26 43 102 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 32 48 107 -+56 71 121 61 75 125 59 74 124 61 75 125 61 75 125 61 75 125 -+60 75 125 61 75 125 60 75 125 59 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 -+59 74 124 58 73 123 58 73 123 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 58 73 123 59 74 124 58 73 123 -+57 72 122 58 73 123 58 73 123 58 73 123 58 73 123 46 61 115 -+25 42 101 24 41 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 38 54 110 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 55 70 121 -+56 70 122 55 70 121 54 70 120 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 54 69 120 55 70 121 54 69 120 53 68 119 -+54 69 120 54 69 120 54 69 120 54 69 120 53 68 119 55 70 121 -+37 53 109 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 44 60 114 51 66 119 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+49 65 117 48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 48 64 117 47 63 116 33 49 106 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 101 24 41 99 43 58 114 -+46 61 115 45 60 114 44 59 113 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 44 60 114 43 60 114 44 60 114 -+44 60 114 44 60 114 43 59 113 25 42 101 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 27 43 102 40 56 111 -+40 56 111 39 55 111 40 56 111 38 54 111 39 55 111 39 55 111 -+39 55 111 39 55 111 38 54 110 39 55 111 29 46 104 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 25 42 101 32 48 107 35 51 108 35 51 108 -+35 51 108 35 51 108 34 50 107 34 50 107 34 50 107 29 46 104 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+64 78 127 64 78 127 64 78 127 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 64 78 128 64 78 128 65 79 128 65 79 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 127 66 80 127 66 80 128 66 80 128 -+66 80 129 66 80 129 66 80 129 66 80 128 66 80 129 65 79 128 -+65 79 128 66 80 129 67 81 129 64 78 128 50 65 118 36 52 108 -+27 44 102 26 43 102 25 42 101 24 41 100 24 41 100 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 24 41 100 24 41 100 -+25 42 101 26 43 102 29 47 104 43 58 114 57 72 122 68 81 130 -+67 80 128 66 80 129 65 79 128 66 80 129 66 80 129 66 80 128 -+66 80 129 66 80 129 66 80 128 66 80 128 66 80 127 66 80 127 -+66 80 127 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+65 79 128 66 80 128 65 79 128 65 79 128 65 79 128 64 78 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 64 78 127 65 79 128 -+64 78 127 64 78 127 63 77 126 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 63 77 126 63 77 126 62 76 125 63 77 126 62 76 125 -+44 60 114 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 31 47 105 57 72 122 -+61 75 125 59 74 124 61 75 125 61 75 125 61 75 125 60 75 125 -+61 75 125 60 75 125 59 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 59 74 124 60 75 125 59 74 124 -+58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 57 72 122 -+58 73 123 58 73 123 57 72 122 58 73 123 52 67 118 27 44 102 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 31 47 105 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 55 70 121 -+55 70 121 54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 54 69 120 55 70 121 54 69 120 53 68 119 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 47 63 116 -+27 44 102 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 32 48 107 53 67 120 50 65 118 49 64 117 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 48 64 117 48 63 117 43 59 113 25 42 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 32 48 107 46 61 115 -+45 60 114 44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 44 60 114 43 60 114 44 60 114 -+44 60 114 44 60 114 35 52 107 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 34 50 106 40 56 111 -+40 56 111 40 56 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 37 53 109 26 43 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 26 43 102 34 50 107 35 51 108 35 51 108 -+35 51 108 35 51 108 35 51 108 33 49 106 33 49 106 27 44 102 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+63 77 126 63 77 126 64 78 127 65 79 128 65 79 128 64 78 127 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 64 78 128 65 79 128 -+65 79 128 66 80 128 66 80 128 65 79 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 127 66 80 127 -+66 80 128 66 80 128 66 80 128 66 80 129 66 80 129 66 80 128 -+66 80 129 66 80 129 65 79 128 66 80 129 67 81 129 68 82 130 -+64 78 128 53 67 120 43 59 113 36 52 108 31 47 105 26 43 102 -+23 40 100 23 40 100 24 41 100 24 41 100 24 41 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+24 41 100 23 40 100 24 41 100 28 45 103 34 50 107 39 55 110 -+48 63 117 58 73 123 68 81 130 68 81 130 66 80 129 66 80 129 -+65 79 128 66 80 129 66 80 128 66 80 129 66 80 129 66 80 129 -+66 80 128 66 80 128 66 80 128 66 80 127 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 65 79 128 66 80 128 -+66 80 128 65 79 128 65 79 128 64 78 128 64 78 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 64 78 127 65 79 128 65 79 128 64 78 127 -+63 77 126 63 77 126 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 63 77 126 64 78 127 -+63 77 126 63 77 126 62 76 125 63 77 126 58 73 123 38 54 109 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 23 40 100 34 50 107 58 73 123 61 75 125 -+59 74 124 61 75 125 61 75 125 61 75 125 60 75 125 61 75 125 -+60 75 125 59 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 59 74 124 60 75 125 59 74 124 58 73 123 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 58 73 123 58 73 123 58 73 123 57 72 122 58 73 123 -+58 73 123 57 72 122 58 73 123 55 70 121 31 47 105 23 40 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 27 44 102 52 67 118 56 70 122 55 69 121 -+56 70 122 56 70 122 56 70 122 56 70 122 55 70 121 56 70 122 -+54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 54 69 120 54 69 120 53 68 119 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 53 68 119 34 50 107 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+25 42 101 48 63 117 50 65 118 49 64 117 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 49 65 117 50 65 118 49 65 117 -+48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+48 64 117 49 65 117 48 64 116 48 64 117 34 50 107 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 40 57 112 46 61 115 -+45 60 114 44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 44 60 114 43 60 114 44 60 114 44 60 114 -+44 60 114 43 59 113 27 44 102 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 25 42 101 38 54 110 40 56 111 -+39 55 111 40 56 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 38 54 110 39 55 111 33 49 106 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 28 45 103 35 51 108 35 52 107 35 51 108 -+35 51 108 34 50 107 35 51 108 33 49 106 32 48 105 25 42 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+64 78 127 64 78 127 63 77 126 64 78 127 64 78 127 65 79 128 -+65 79 128 64 78 127 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 64 78 128 -+64 78 128 65 79 128 65 79 128 66 80 128 66 80 128 65 79 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 127 66 80 127 66 80 128 66 80 128 66 80 128 66 80 129 -+66 80 129 66 80 129 66 80 129 66 80 129 66 80 129 65 79 128 -+66 80 129 66 80 129 68 81 130 65 79 128 60 75 125 55 70 121 -+49 64 117 40 56 111 32 50 106 25 42 100 23 39 99 23 40 99 -+23 40 100 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 23 40 100 23 40 99 23 39 99 28 45 103 -+36 52 108 44 60 114 52 67 118 57 72 122 62 76 125 67 81 129 -+67 81 129 66 80 129 66 80 129 65 79 128 66 80 129 66 80 129 -+66 80 128 66 80 129 66 80 129 66 80 128 66 80 128 66 80 128 -+66 80 127 66 80 127 66 80 127 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 65 79 128 66 80 128 65 79 128 -+65 79 128 64 78 128 64 78 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 64 78 127 65 79 128 64 78 127 64 78 127 63 77 126 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 63 77 126 64 78 127 63 77 126 -+63 77 126 63 77 126 64 78 127 51 66 119 31 47 105 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 23 40 100 38 54 109 58 73 123 61 75 125 59 74 124 -+61 75 125 61 75 125 61 75 125 60 75 125 61 75 125 60 75 125 -+59 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 59 74 124 59 74 124 58 73 123 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+58 73 123 59 74 124 58 73 123 57 72 122 58 73 123 58 73 123 -+57 72 122 58 73 123 57 72 122 33 49 106 23 40 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 25 42 101 46 61 115 56 70 122 55 69 121 56 70 122 -+56 70 122 56 70 122 56 70 122 55 70 121 56 70 122 55 70 121 -+54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 54 69 120 54 69 120 53 68 119 54 69 120 54 69 120 -+54 69 120 54 69 120 53 68 119 54 69 120 43 59 113 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 100 23 40 100 -+39 55 111 51 66 119 50 65 118 49 64 117 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 49 65 117 -+48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 48 64 117 48 64 117 43 60 114 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 31 47 105 45 60 114 46 61 115 -+44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 44 60 114 44 60 114 43 60 114 44 60 114 43 59 113 -+44 60 114 37 53 109 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 30 46 104 39 55 110 39 55 111 -+40 56 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 38 54 110 29 46 104 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 32 48 107 35 51 108 34 50 108 35 51 108 -+35 51 108 35 51 108 34 50 107 33 49 106 30 46 104 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+64 78 127 64 78 127 64 78 127 63 77 126 64 78 127 64 78 127 -+64 78 127 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 64 78 128 65 79 128 65 79 128 65 79 128 66 80 128 -+65 79 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 127 66 80 127 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 129 66 80 129 66 80 128 66 80 129 -+66 80 129 66 80 129 65 79 128 66 80 129 66 80 129 66 80 129 -+65 79 128 64 78 128 64 78 127 62 76 125 56 70 122 46 61 115 -+37 53 109 27 44 103 23 40 99 23 40 100 23 40 100 24 41 100 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 24 41 100 23 40 100 23 40 99 -+24 41 101 31 47 105 40 57 112 50 65 118 60 75 125 63 77 126 -+64 78 127 65 79 128 66 80 129 66 80 129 66 80 129 66 80 129 -+65 79 128 66 80 129 66 80 129 66 80 129 66 80 129 66 80 129 -+66 80 129 66 80 128 66 80 128 66 80 128 66 80 127 66 80 127 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 65 79 128 66 80 128 66 80 128 65 79 128 65 79 128 -+64 78 128 64 78 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+64 78 127 65 79 128 64 78 127 64 78 127 63 77 126 63 77 126 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 63 77 126 64 78 127 63 77 126 62 76 125 -+63 77 126 63 77 126 43 58 114 26 43 102 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 38 54 110 58 73 123 61 75 125 59 74 124 61 75 125 -+61 75 125 61 75 125 60 75 125 61 75 125 60 75 125 59 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 59 74 124 59 74 124 58 73 123 58 73 123 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 -+59 74 124 58 73 123 57 72 122 58 73 123 58 73 123 58 73 123 -+58 73 123 58 73 123 36 52 108 24 41 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 38 54 110 55 69 121 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 55 70 121 56 70 122 55 70 121 54 70 120 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+54 69 120 55 70 121 53 68 119 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 52 67 118 25 43 102 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 30 46 104 -+48 63 117 51 66 119 49 64 117 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 48 65 116 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 -+49 65 117 48 64 116 50 65 118 29 46 104 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 25 42 101 38 54 109 46 61 115 45 60 114 -+44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+44 60 114 45 60 114 43 60 114 44 60 114 44 60 114 44 60 114 -+43 59 113 31 47 105 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 25 42 101 34 50 107 40 56 111 39 55 111 -+40 56 111 39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 36 52 108 25 42 102 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 101 25 42 101 35 51 108 35 51 108 35 51 108 35 51 108 -+35 51 108 35 51 108 34 50 107 33 49 106 27 44 103 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+63 77 126 64 78 127 64 78 127 65 79 128 65 79 128 64 78 127 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 64 78 128 64 78 128 -+65 79 128 65 79 128 66 80 128 66 80 128 65 79 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 127 66 80 127 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 129 66 80 129 66 80 129 66 80 129 66 80 129 -+66 80 129 66 80 129 65 79 128 66 80 129 66 80 129 66 80 129 -+67 81 129 68 81 130 64 78 128 56 70 122 48 63 117 40 57 112 -+34 50 107 28 45 103 27 44 102 27 44 102 26 43 102 26 43 101 -+25 42 101 25 42 101 24 41 100 24 41 100 24 41 100 24 41 100 -+24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 -+24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 -+24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 26 43 101 26 43 102 27 44 102 -+27 44 102 31 47 105 37 53 109 44 60 114 52 67 118 59 75 125 -+67 81 129 68 81 130 67 80 128 66 80 129 66 80 129 65 79 128 -+66 80 129 66 80 129 66 80 129 66 80 129 66 80 128 66 80 129 -+66 80 129 66 80 129 66 80 128 66 80 128 66 80 128 66 80 127 -+66 80 127 66 80 127 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 65 79 128 66 80 128 -+65 79 128 65 79 128 65 79 128 64 78 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 64 78 127 65 79 128 64 78 127 -+64 78 127 63 77 126 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+63 77 126 64 78 127 63 77 126 63 77 126 63 77 126 63 77 126 -+58 73 123 36 52 108 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 -+38 54 110 61 75 125 61 75 125 59 74 124 61 75 125 61 75 125 -+61 75 125 60 75 125 61 75 125 60 75 125 59 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 -+60 75 125 59 74 124 58 73 123 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 59 74 124 -+58 73 123 57 72 122 58 73 123 58 73 123 58 73 123 57 72 122 -+57 72 122 42 57 112 25 42 101 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+29 47 104 53 67 120 56 70 122 55 69 121 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 55 70 121 54 70 120 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+54 69 120 53 68 119 54 69 120 54 69 120 54 69 120 54 69 120 -+53 68 119 54 69 120 54 69 120 34 50 106 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 40 56 111 -+51 66 119 49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 49 65 117 49 65 117 48 65 116 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+48 64 116 48 64 117 40 57 112 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 29 45 103 44 60 114 46 61 115 44 59 113 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 43 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+40 56 111 26 43 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 27 44 102 38 54 109 40 56 111 40 56 111 -+39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 38 54 110 33 49 106 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 29 46 104 35 51 108 35 51 108 35 51 108 35 51 108 -+35 51 108 35 51 108 34 50 107 33 49 106 24 41 101 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 63 77 126 63 77 126 64 78 127 64 78 127 65 79 128 -+64 78 127 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+64 78 128 65 79 128 65 79 128 65 79 128 66 80 128 66 80 128 -+65 79 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 127 66 80 127 66 80 127 -+66 80 128 66 80 128 66 80 128 66 80 129 66 80 129 66 80 129 -+66 80 129 66 80 129 66 80 129 66 80 129 66 80 129 66 80 129 -+66 80 129 65 79 128 66 80 129 66 80 129 67 81 129 68 81 130 -+68 82 130 68 81 130 63 77 126 58 73 123 55 69 121 51 66 119 -+47 63 116 43 59 113 40 56 111 38 54 110 37 53 109 36 52 108 -+35 52 107 34 50 107 33 49 106 32 50 106 32 48 107 31 47 105 -+31 47 105 31 47 105 31 47 105 32 48 105 32 48 107 32 50 106 -+33 49 106 34 50 107 35 51 108 36 52 108 37 53 109 39 55 111 -+42 57 112 45 60 114 49 64 117 53 68 119 56 71 121 61 75 125 -+65 79 128 68 82 130 68 82 130 68 81 130 67 81 129 66 80 129 -+66 80 129 65 79 128 66 80 129 66 80 129 66 80 129 66 80 129 -+66 80 129 66 80 128 66 80 129 66 80 129 66 80 129 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 127 66 80 127 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 65 79 128 -+65 79 128 64 78 128 64 78 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 64 78 127 65 79 128 65 79 128 64 78 127 64 78 127 -+63 77 126 63 77 126 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 63 77 126 64 78 127 -+64 78 127 63 77 126 62 76 125 63 77 126 62 76 125 50 65 118 -+29 46 103 23 40 99 25 42 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 26 43 101 43 60 114 -+62 76 125 61 75 125 59 74 124 61 75 125 61 75 125 61 75 125 -+60 75 125 61 75 125 60 75 125 59 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 60 75 125 -+59 74 124 58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 -+58 73 123 57 72 122 58 73 123 58 73 123 57 72 122 58 73 123 -+47 63 116 25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 26 43 102 -+49 64 117 56 70 122 55 69 121 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 55 70 121 55 70 121 54 70 120 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 55 70 121 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+53 68 119 54 69 120 42 58 112 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 31 47 105 50 65 118 -+50 65 118 49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 49 65 117 48 65 116 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 49 65 116 -+48 64 117 47 63 116 29 46 103 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 36 52 108 46 61 115 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 -+45 60 114 43 60 114 44 60 114 44 60 114 43 59 113 43 59 113 -+34 50 106 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 31 47 105 40 56 111 40 56 111 40 56 111 -+39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 -+38 54 110 38 54 110 27 44 102 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 33 49 106 35 51 108 35 51 108 35 51 108 35 51 108 -+35 51 108 34 50 107 34 50 107 30 46 104 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 63 77 126 63 77 126 64 78 127 64 78 127 -+65 79 128 65 79 128 64 78 127 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 64 78 128 64 78 128 64 78 128 65 79 128 65 79 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 127 66 80 127 66 80 127 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 129 66 80 129 66 80 129 66 80 129 66 80 128 -+66 80 129 66 80 129 66 80 129 66 80 129 66 80 129 66 80 129 -+65 79 128 66 80 129 66 80 129 66 80 129 66 80 129 67 80 128 -+67 81 129 68 81 130 68 81 130 67 80 128 65 79 128 64 78 128 -+63 77 126 63 77 126 61 75 125 61 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 61 75 125 -+62 76 125 63 77 126 64 78 127 65 79 128 66 80 129 68 81 130 -+68 81 130 67 81 129 67 81 129 66 80 129 66 80 129 66 80 129 -+66 80 129 66 80 129 66 80 129 66 80 129 66 80 129 66 80 129 -+66 80 129 66 80 129 66 80 129 66 80 128 66 80 129 66 80 129 -+66 80 129 66 80 129 66 80 128 66 80 128 66 80 128 66 80 127 -+66 80 127 66 80 127 66 80 127 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+65 79 128 66 80 128 65 79 128 65 79 128 65 79 128 64 78 128 -+64 78 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+64 78 127 65 79 128 64 78 127 64 78 127 63 77 126 63 77 126 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 63 77 126 -+63 77 126 62 76 125 63 77 126 58 73 123 38 54 110 25 42 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 27 44 103 49 64 117 61 75 125 -+61 75 125 59 74 124 61 75 125 61 75 125 61 75 125 60 75 125 -+61 75 125 60 75 125 59 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 -+59 74 124 58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 58 73 123 58 73 123 58 73 123 -+57 72 122 58 73 123 58 73 123 57 72 122 59 74 124 48 64 116 -+26 43 101 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 23 40 100 46 61 115 -+57 72 122 55 69 121 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 55 70 121 54 70 120 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 54 69 120 55 70 121 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 53 68 119 -+54 69 120 49 64 117 28 45 103 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 44 60 114 51 66 119 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 49 65 117 50 65 118 48 65 116 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 -+48 64 117 39 55 110 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 26 43 102 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+44 60 114 43 60 114 44 60 114 44 60 114 44 60 114 42 58 112 -+25 42 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 37 53 109 40 56 111 39 55 111 39 55 111 -+39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 36 52 108 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+27 44 102 35 51 108 34 50 107 35 51 108 35 51 108 34 50 107 -+35 51 108 34 50 107 34 50 107 26 43 102 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 63 77 126 63 77 126 -+64 78 127 64 78 127 65 79 128 64 78 127 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 64 78 128 65 79 128 -+65 79 128 65 79 128 66 80 128 66 80 128 65 79 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 127 66 80 127 66 80 127 -+66 80 127 66 80 128 66 80 128 66 80 128 66 80 128 66 80 129 -+66 80 129 66 80 129 66 80 129 66 80 129 66 80 129 66 80 129 -+66 80 129 66 80 129 66 80 129 66 80 129 66 80 129 66 80 129 -+66 80 129 66 80 129 65 79 128 66 80 129 66 80 129 66 80 129 -+66 80 129 66 80 129 66 80 129 66 80 129 66 80 129 66 80 129 -+66 80 129 66 80 129 66 80 129 66 80 129 66 80 129 66 80 129 -+66 80 129 66 80 129 66 80 129 66 80 129 66 80 129 66 80 129 -+66 80 129 66 80 129 66 80 129 66 80 129 66 80 129 66 80 129 -+66 80 129 66 80 129 66 80 129 66 80 129 66 80 128 66 80 129 -+66 80 129 66 80 129 66 80 129 66 80 129 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 127 66 80 127 66 80 127 66 80 127 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 65 79 128 65 79 128 64 78 128 64 78 128 64 78 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 64 78 127 -+65 79 128 64 78 127 63 77 126 63 77 126 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 63 77 126 64 78 127 63 77 126 62 76 125 -+62 76 125 64 78 127 53 67 120 29 46 103 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 27 44 103 53 67 120 61 75 125 61 75 125 -+60 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+60 75 125 59 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 59 74 124 59 74 124 58 73 123 -+58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 58 73 123 59 74 124 58 73 123 57 72 122 -+58 73 123 58 73 123 57 72 122 58 73 123 51 66 119 26 43 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 101 23 40 99 40 56 111 55 69 121 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+55 70 121 56 70 122 54 70 120 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 53 68 119 -+53 68 119 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+53 68 119 36 52 108 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 34 50 108 51 66 119 50 65 118 -+49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+49 65 117 50 65 118 49 65 117 48 65 116 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 48 64 117 49 65 117 48 63 117 -+46 61 115 29 47 104 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 37 53 109 46 61 115 45 60 114 44 59 113 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 45 60 114 -+44 60 114 44 60 114 44 60 114 43 59 113 44 60 114 34 50 107 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 28 45 103 40 56 111 40 56 111 39 55 111 40 56 111 -+38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 38 54 110 -+39 55 111 29 46 104 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+31 47 105 35 51 108 35 51 108 35 51 108 35 51 108 35 51 108 -+34 50 107 34 50 107 32 48 105 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+63 77 126 64 78 127 63 77 126 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 63 77 126 64 78 127 64 78 127 65 79 128 65 79 128 -+64 78 127 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 64 78 128 64 78 128 65 79 128 65 79 128 65 79 128 -+66 80 128 66 80 128 66 80 128 65 79 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 127 66 80 127 -+66 80 127 66 80 127 66 80 127 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 129 66 80 129 66 80 129 -+66 80 129 66 80 129 66 80 129 66 80 129 66 80 129 66 80 129 -+66 80 128 66 80 129 66 80 129 66 80 129 66 80 129 66 80 129 -+66 80 129 66 80 129 66 80 129 66 80 129 66 80 129 66 80 129 -+66 80 129 66 80 129 66 80 129 66 80 129 66 80 129 66 80 129 -+66 80 129 66 80 129 66 80 129 66 80 129 66 80 129 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 127 -+66 80 127 66 80 127 66 80 127 66 80 127 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 65 79 128 65 79 128 65 79 128 64 78 128 -+64 78 128 64 78 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 64 78 127 64 78 127 -+63 77 126 63 77 126 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 63 77 126 63 77 126 62 76 125 63 77 126 63 77 126 -+61 75 125 40 56 111 23 40 99 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 31 47 105 58 73 123 61 75 125 59 74 124 61 75 125 -+61 75 125 61 75 125 60 75 125 61 75 125 60 75 125 59 75 125 -+59 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 59 74 124 60 75 125 59 74 124 58 73 123 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+58 73 123 59 74 124 59 74 124 57 72 122 58 73 123 58 73 123 -+58 73 123 57 72 122 58 73 123 53 68 119 29 46 103 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 34 50 107 54 69 120 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 55 70 121 56 70 122 -+56 70 122 54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 54 69 120 55 70 121 54 69 120 53 68 119 -+54 69 120 54 69 120 54 69 120 54 69 120 53 68 119 54 69 120 -+45 60 114 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 26 43 102 50 65 118 50 65 118 49 64 117 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 -+50 65 118 49 65 117 48 65 116 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 48 64 117 49 65 117 48 64 116 47 63 116 -+40 56 111 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+27 44 102 46 61 115 45 60 114 45 60 114 44 59 113 45 60 114 -+45 60 114 45 60 114 45 60 114 44 60 114 45 60 114 44 60 114 -+43 60 114 44 60 114 43 59 113 44 60 114 43 59 113 25 42 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 36 52 108 40 56 111 40 56 111 40 56 111 38 54 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+37 53 109 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 -+34 50 107 34 50 107 35 51 108 35 51 108 35 51 108 35 51 108 -+34 50 107 34 50 107 28 45 103 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+62 76 125 63 77 126 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 63 77 126 63 77 126 64 78 127 64 78 127 -+65 79 128 65 79 128 64 78 127 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 64 78 128 64 78 128 64 78 128 -+65 79 128 65 79 128 65 79 128 66 80 128 66 80 128 65 79 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 127 66 80 127 66 80 127 -+66 80 127 66 80 127 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 129 66 80 129 66 80 129 66 80 129 66 80 129 66 80 129 -+66 80 129 66 80 129 66 80 129 66 80 129 66 80 129 66 80 129 -+66 80 129 66 80 129 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 127 66 80 127 66 80 127 66 80 127 66 80 127 66 80 127 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 65 79 128 66 80 128 66 80 128 -+65 79 128 65 79 128 65 79 128 64 78 128 64 78 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+64 78 127 65 79 128 64 78 127 64 78 127 64 78 127 63 77 126 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 63 77 126 64 78 127 -+63 77 126 63 77 126 62 76 125 63 77 126 62 76 125 50 65 118 -+29 46 104 23 40 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 -+37 53 109 59 74 124 61 75 125 59 74 124 61 75 125 61 75 125 -+61 75 125 60 75 125 61 75 125 60 75 125 59 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+59 74 124 60 75 125 59 74 124 58 73 123 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 58 73 123 58 73 123 57 72 122 58 73 123 58 73 123 -+57 72 122 58 73 123 54 69 120 32 48 107 24 41 100 24 41 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 28 45 103 50 65 118 56 70 122 55 69 121 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 54 69 120 55 70 121 54 69 120 53 68 119 54 69 120 -+54 69 120 54 69 120 54 69 120 53 68 119 54 69 120 51 66 119 -+27 44 102 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 40 57 112 51 66 119 50 65 118 49 64 117 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+49 65 117 49 65 117 48 65 116 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 48 64 117 48 64 117 47 63 116 -+27 44 102 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+38 54 110 46 61 115 45 60 114 44 59 113 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 44 60 114 -+43 60 114 44 60 114 43 60 114 44 60 114 33 49 106 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+27 43 102 40 56 111 39 55 110 39 55 111 40 56 111 38 54 111 -+39 55 111 39 55 111 39 55 111 39 55 111 38 54 110 39 55 111 -+31 47 105 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 28 45 103 -+34 50 107 35 51 108 35 51 108 35 51 108 35 51 108 34 50 107 -+34 50 107 34 50 106 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+63 77 126 63 77 126 63 77 126 64 78 127 64 78 127 63 77 126 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 63 77 126 64 78 127 -+64 78 127 64 78 127 65 79 128 65 79 128 64 78 127 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+64 78 128 64 78 128 65 79 128 65 79 128 65 79 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 127 66 80 127 66 80 127 66 80 127 -+66 80 127 66 80 127 66 80 127 66 80 127 66 80 127 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 127 66 80 127 66 80 127 -+66 80 127 66 80 127 66 80 127 66 80 127 66 80 127 66 80 127 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+65 79 128 66 80 128 66 80 128 66 80 128 65 79 128 65 79 128 -+65 79 128 64 78 128 64 78 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 64 78 127 64 78 127 63 77 126 63 77 126 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 63 77 126 64 78 127 64 78 127 63 77 126 -+63 77 126 63 77 126 65 79 128 56 71 121 36 52 108 25 42 101 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 44 60 114 -+59 74 124 61 75 125 59 74 124 61 75 125 61 75 125 61 75 125 -+60 75 125 61 75 125 60 75 125 59 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 59 74 124 59 74 124 58 73 123 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 -+58 73 123 58 73 123 57 72 122 58 73 123 58 73 123 57 72 122 -+58 73 123 57 72 122 32 50 106 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 101 48 63 117 56 70 122 55 69 121 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 55 70 121 -+54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 54 69 120 53 68 119 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 32 48 105 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 32 50 106 50 65 118 50 65 118 49 64 117 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+49 65 117 48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 48 64 117 49 65 117 48 64 116 49 65 117 36 52 108 -+23 40 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 29 45 103 -+44 60 114 45 60 114 45 60 114 44 59 113 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 43 60 114 -+44 60 114 44 60 114 44 60 114 42 58 112 26 43 102 25 42 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 23 40 100 -+35 52 107 40 56 111 40 56 111 40 56 111 39 55 111 38 54 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 38 54 110 -+26 43 102 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 31 47 105 -+35 51 108 35 51 108 35 51 108 35 51 108 34 50 107 35 51 108 -+34 50 107 31 47 105 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+55 68 119 64 78 127 63 77 126 63 77 126 63 77 126 64 78 127 -+64 78 127 63 77 126 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 63 77 126 -+63 77 126 63 77 126 64 78 127 64 78 127 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 64 78 128 64 78 128 65 79 128 65 79 128 -+65 79 128 65 79 128 66 80 128 66 80 128 65 79 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 127 -+66 80 127 66 80 127 66 80 127 66 80 127 66 80 127 66 80 127 -+66 80 127 66 80 127 66 80 127 66 80 127 66 80 127 66 80 127 -+66 80 127 66 80 127 66 80 127 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 65 79 128 65 79 128 65 79 128 65 79 128 64 78 128 -+64 78 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 64 78 127 65 79 128 64 78 127 64 78 127 -+64 78 127 63 77 126 63 77 126 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 63 77 126 63 77 126 62 76 125 -+63 77 126 62 76 125 42 58 112 27 44 102 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 25 43 102 52 67 118 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 60 75 125 59 75 125 59 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 -+59 74 124 58 73 123 58 73 123 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 59 74 124 -+58 73 123 57 72 122 58 73 123 58 73 123 57 72 122 58 73 123 -+58 73 123 31 47 105 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 101 -+23 40 99 44 60 115 56 70 122 56 70 122 55 69 121 56 70 122 -+56 70 122 56 70 122 56 70 122 55 70 121 55 70 121 54 70 120 -+54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+54 69 120 55 70 121 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 53 68 119 55 70 121 39 55 110 25 42 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+26 43 102 44 60 114 51 66 119 49 64 117 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 50 65 118 -+48 65 116 48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 48 64 117 48 64 117 44 60 114 25 42 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 37 53 109 -+46 61 115 46 61 115 44 59 113 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 44 60 114 43 60 114 43 60 114 -+44 60 114 43 59 113 44 60 114 35 52 107 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 27 43 102 -+38 54 110 40 56 111 39 55 111 40 56 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 38 54 110 39 55 111 33 49 106 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 26 43 102 33 49 106 -+35 51 108 35 51 108 35 51 108 35 51 108 35 51 108 34 50 107 -+34 50 107 27 44 103 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 40 57 112 59 74 124 62 76 125 63 77 126 62 76 125 -+63 77 126 64 78 127 64 78 127 63 77 126 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 63 77 126 63 77 126 64 78 127 -+64 78 127 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 64 78 128 64 78 128 65 79 128 65 79 128 65 79 128 -+65 79 128 66 80 128 66 80 128 66 80 128 65 79 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 65 79 128 66 80 128 66 80 128 -+66 80 128 65 79 128 65 79 128 65 79 128 65 79 128 64 78 128 -+64 78 128 64 78 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 64 78 127 65 79 128 -+65 79 128 64 78 127 64 78 127 63 77 126 63 77 126 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 63 77 126 64 78 127 -+64 78 127 63 77 126 63 77 126 62 76 125 63 77 126 62 76 125 -+55 69 121 31 47 105 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 32 48 107 58 73 123 61 75 125 59 74 124 -+61 75 125 61 75 125 61 75 125 60 75 125 61 75 125 61 75 125 -+60 75 125 59 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 59 74 124 60 75 125 59 74 124 -+58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 58 73 123 59 74 124 59 74 124 57 72 122 -+58 73 123 58 73 123 58 73 123 57 72 122 58 73 123 57 72 122 -+34 50 107 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+39 55 111 56 70 122 55 69 121 56 70 122 56 70 122 56 70 122 -+56 70 122 55 70 121 56 70 122 55 70 121 54 70 120 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 54 69 120 53 68 119 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 47 63 116 27 44 102 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+34 50 107 52 67 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 49 65 117 50 65 118 48 65 116 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+48 64 117 49 65 116 48 64 117 48 64 117 31 47 105 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 28 45 103 43 59 113 -+46 61 115 44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 44 60 114 43 60 114 44 60 114 -+44 60 114 44 60 114 42 58 112 28 45 103 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 32 48 105 -+39 55 110 39 55 111 40 56 111 39 55 111 38 54 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 38 54 110 29 45 103 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 100 29 45 103 35 51 108 -+34 50 107 35 51 108 35 51 108 34 50 107 35 51 108 33 49 106 -+32 48 107 26 43 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 23 40 99 30 46 104 48 63 117 58 73 123 64 78 127 -+63 77 126 63 77 126 63 77 126 64 78 127 64 78 127 63 77 126 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 63 77 126 -+63 77 126 64 78 127 64 78 127 65 79 128 65 79 128 64 78 127 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 64 78 128 64 78 128 64 78 128 -+65 79 128 65 79 128 65 79 128 65 79 128 66 80 128 66 80 128 -+66 80 128 66 80 128 65 79 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+65 79 128 66 80 128 66 80 128 66 80 128 65 79 128 65 79 128 -+65 79 128 65 79 128 64 78 128 64 78 128 64 78 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 64 78 127 65 79 128 65 79 128 64 78 127 -+64 78 127 64 78 127 63 77 126 63 77 126 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 63 77 126 64 78 127 63 77 126 -+63 77 126 62 76 125 63 77 126 63 77 126 55 70 121 39 55 110 -+23 40 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+25 42 101 40 56 111 59 74 124 61 75 125 59 74 124 61 75 125 -+61 75 125 61 75 125 60 75 125 61 75 125 60 75 125 60 75 125 -+59 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 59 74 124 60 75 125 59 74 124 58 73 123 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 58 73 123 58 73 123 57 72 122 -+58 73 123 58 73 123 57 72 122 58 73 123 56 71 121 37 53 109 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 34 50 107 -+55 69 121 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 55 70 121 54 70 120 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+54 69 120 53 68 119 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 52 67 118 32 48 107 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 27 44 103 -+49 64 117 51 66 119 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 48 65 116 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 48 64 116 48 64 117 40 56 111 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 36 52 108 47 63 116 -+45 60 114 44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 44 60 114 45 60 114 43 60 114 44 60 114 44 60 114 -+44 60 114 43 59 113 37 53 109 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 26 43 101 36 52 108 -+40 56 111 40 56 111 39 55 111 39 55 111 38 54 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 36 52 108 25 42 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 32 48 107 35 51 108 -+35 51 108 35 51 108 35 51 108 35 51 108 34 50 107 33 49 106 -+31 47 105 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 33 49 106 48 63 117 -+63 77 126 63 77 126 62 76 125 63 77 126 63 77 126 64 78 127 -+63 77 126 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+63 77 126 63 77 126 63 77 126 64 78 127 64 78 127 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+64 78 128 64 78 128 64 78 128 64 78 128 65 79 128 65 79 128 -+65 79 128 65 79 128 66 80 128 66 80 128 66 80 128 66 80 128 -+65 79 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 65 79 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 65 79 128 65 79 128 65 79 128 65 79 128 64 78 128 -+64 78 128 64 78 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+64 78 127 65 79 128 65 79 128 64 78 127 64 78 127 63 77 126 -+63 77 126 63 77 126 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 63 77 126 64 78 127 64 78 127 63 77 126 63 77 126 -+63 77 126 64 78 127 58 73 123 40 56 111 27 44 103 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 23 40 100 27 44 102 -+49 64 117 59 74 124 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 60 75 125 60 75 125 59 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 59 74 124 59 74 124 58 73 123 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 58 73 123 58 73 123 58 73 123 57 72 122 58 73 123 -+58 73 123 57 72 122 58 73 123 58 73 123 37 53 109 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 29 46 104 52 67 118 -+56 70 122 55 69 121 56 70 122 56 70 122 56 70 122 56 70 122 -+55 70 121 56 70 122 55 70 121 54 70 120 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 55 70 121 -+54 69 120 53 68 119 54 69 120 54 69 120 54 69 120 54 69 120 -+53 68 119 54 69 120 38 54 110 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 101 23 40 99 44 60 114 -+51 66 119 50 65 118 49 64 117 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 49 65 117 50 65 118 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 -+49 65 117 48 63 117 46 61 115 31 47 105 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 27 44 102 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 44 60 114 43 60 114 44 60 114 44 60 114 -+43 59 113 44 60 114 28 45 103 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 29 46 104 40 56 111 -+40 56 111 40 56 111 39 55 111 38 54 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 38 54 110 32 48 105 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 26 43 101 35 51 108 35 51 108 -+35 51 108 35 51 108 35 51 108 35 51 108 34 50 107 33 49 106 -+27 44 103 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 25 42 101 -+32 50 106 55 70 121 64 78 127 63 77 126 63 77 126 63 77 126 -+64 78 127 64 78 127 63 77 126 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 63 77 126 64 78 127 64 78 127 -+64 78 127 64 78 127 65 79 128 64 78 127 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 64 78 128 64 78 128 -+64 78 128 64 78 128 65 79 128 65 79 128 65 79 128 65 79 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 65 79 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 65 79 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 64 78 128 64 78 128 64 78 128 64 78 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 64 78 127 65 79 128 -+65 79 128 64 78 127 64 78 127 64 78 127 63 77 126 63 77 126 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 63 77 126 63 77 126 62 76 125 63 77 126 -+63 77 126 43 59 113 27 44 102 25 42 101 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 23 40 99 34 50 106 57 72 122 -+61 75 125 61 75 125 59 74 124 61 75 125 61 75 125 61 75 125 -+61 75 125 60 75 125 60 75 125 59 75 125 59 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 59 74 124 59 74 124 58 73 123 58 73 123 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+58 73 123 59 74 124 58 73 123 57 72 122 58 73 123 58 73 123 -+57 72 122 58 73 123 59 74 124 35 52 107 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 25 42 101 51 66 119 56 70 122 -+56 70 122 55 69 121 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 55 70 121 54 70 120 54 70 120 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 54 69 120 55 70 121 54 69 120 -+53 68 119 54 69 120 54 69 120 54 69 120 54 69 120 53 68 119 -+54 69 120 46 61 115 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 23 40 100 36 52 108 51 66 119 -+50 65 118 49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 49 65 117 50 65 118 49 65 117 48 65 116 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+48 64 117 47 63 116 40 56 111 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 23 40 100 38 54 110 46 61 115 45 60 114 -+44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+44 60 114 45 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 37 53 109 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 34 50 108 40 56 111 -+39 55 110 40 56 111 39 55 111 38 54 111 39 55 111 39 55 111 -+39 55 111 39 55 111 38 54 110 38 54 110 25 42 101 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 29 47 104 35 51 108 34 50 107 -+35 51 108 35 51 108 34 50 107 35 51 108 34 50 107 33 49 106 -+25 42 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 23 40 99 37 53 109 57 72 122 62 76 125 63 77 126 -+62 76 125 63 77 126 63 77 126 63 77 126 64 78 127 63 77 126 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 63 77 126 64 78 127 64 78 127 64 78 127 65 79 128 -+65 79 128 65 79 128 64 78 127 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+64 78 128 64 78 128 64 78 128 64 78 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 66 80 128 -+66 80 128 66 80 128 66 80 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 64 78 128 64 78 128 -+64 78 128 64 78 128 64 78 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 64 78 127 64 78 127 64 78 127 -+63 77 126 63 77 126 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 63 77 126 64 78 127 64 78 127 63 77 126 -+63 77 126 62 76 125 63 77 126 63 77 126 61 75 125 50 65 118 -+27 44 103 24 41 100 25 42 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 101 24 41 100 26 43 102 40 57 112 59 74 124 61 75 125 -+60 75 125 61 75 125 61 75 125 61 75 125 60 75 125 61 75 125 -+60 75 125 60 75 125 59 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 60 75 125 -+59 74 124 59 74 124 58 73 123 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 59 74 124 -+59 74 124 57 72 122 58 73 123 58 73 123 58 73 123 57 72 122 -+58 73 123 57 72 122 36 52 108 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 25 42 101 49 64 117 56 70 122 55 69 121 -+56 70 122 56 70 122 56 70 122 56 70 122 55 70 121 56 70 122 -+55 70 121 54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 53 68 119 54 69 120 -+50 65 118 25 43 102 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 100 24 41 100 28 45 103 48 63 117 50 65 118 -+49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 49 65 117 48 65 116 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 48 64 117 49 65 117 49 65 116 -+48 64 117 47 63 116 26 43 102 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 29 45 103 46 61 115 45 60 114 44 59 113 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 -+45 60 114 44 60 114 43 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 26 43 102 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 27 43 102 40 56 111 40 56 111 -+39 55 111 39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 -+39 55 111 38 54 110 39 55 111 33 49 106 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 34 50 108 35 52 107 35 51 108 -+35 51 108 34 50 107 35 51 108 34 50 107 34 50 107 30 46 104 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 23 40 100 25 42 101 40 57 112 54 69 120 -+63 77 126 63 77 126 62 76 125 63 77 126 63 77 126 64 78 127 -+64 78 127 63 77 126 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 63 77 126 63 77 126 63 77 126 64 78 127 -+64 78 127 64 78 127 65 79 128 65 79 128 65 79 128 64 78 127 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 64 78 128 64 78 128 -+64 78 128 64 78 128 64 78 128 64 78 128 64 78 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 64 78 128 64 78 128 64 78 128 -+64 78 128 64 78 128 64 78 128 64 78 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 64 78 127 65 79 128 65 79 128 -+64 78 127 64 78 127 64 78 127 63 77 126 63 77 126 63 77 126 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 63 77 126 64 78 127 63 77 126 63 77 126 62 76 125 -+63 77 126 64 78 127 58 73 123 49 64 117 34 50 106 23 40 99 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+23 40 100 31 47 105 49 64 117 62 76 125 61 75 125 59 74 124 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 60 75 125 -+60 75 125 59 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 -+59 74 124 58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 -+58 73 123 57 72 122 58 73 123 58 73 123 57 72 122 58 73 123 -+56 71 121 38 54 109 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 25 42 101 44 60 114 56 70 122 55 69 121 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 55 70 121 -+54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 54 69 120 53 68 119 54 69 120 -+54 69 120 54 69 120 54 69 120 53 68 119 54 69 120 53 68 119 -+31 47 105 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 25 42 101 40 57 112 51 66 119 49 64 117 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 49 65 117 49 65 117 48 65 116 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 48 64 116 -+49 64 117 34 50 107 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 40 56 111 46 61 115 45 60 114 44 59 113 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+44 60 114 44 60 114 43 60 114 44 60 114 43 59 113 44 60 114 -+35 51 108 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 34 50 107 40 56 111 39 55 111 -+40 56 111 39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 38 54 111 26 43 102 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 29 45 103 35 51 108 34 50 108 35 51 108 -+35 51 108 35 51 108 34 50 107 34 50 107 34 50 107 25 42 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 101 24 41 100 23 40 100 28 45 103 -+38 54 110 53 67 120 64 78 127 63 77 126 62 76 125 63 77 126 -+63 77 126 64 78 127 64 78 127 63 77 126 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 63 77 126 -+63 77 126 64 78 127 64 78 127 64 78 127 64 78 127 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 64 78 128 -+64 78 128 64 78 128 64 78 128 64 78 128 64 78 128 64 78 128 -+64 78 128 64 78 128 64 78 128 64 78 128 64 78 128 64 78 128 -+64 78 128 64 78 128 64 78 128 64 78 128 64 78 128 64 78 128 -+64 78 128 64 78 128 64 78 128 64 78 128 64 78 128 64 78 128 -+64 78 128 64 78 128 64 78 128 64 78 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+64 78 127 65 79 128 65 79 128 65 79 128 64 78 127 64 78 127 -+64 78 127 63 77 126 63 77 126 63 77 126 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 63 77 126 64 78 127 -+64 78 127 64 78 127 63 77 126 63 77 126 63 77 126 64 78 127 -+62 76 125 46 61 115 33 49 106 24 41 100 24 41 100 25 42 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 25 42 100 -+40 57 112 57 72 122 62 76 125 61 75 125 59 74 124 61 75 125 -+61 75 125 61 75 125 60 75 125 61 75 125 60 75 125 60 75 125 -+59 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 59 74 124 59 74 124 59 74 124 -+58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 58 73 123 59 74 124 58 73 123 58 73 123 -+57 72 122 58 73 123 58 73 123 57 72 122 58 73 123 57 72 122 -+36 52 108 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 40 57 112 55 69 121 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 55 70 121 56 70 122 54 70 120 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 54 69 120 54 69 120 53 68 119 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 53 68 119 38 54 109 -+25 42 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 32 50 106 51 66 119 50 65 118 49 64 117 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+49 65 117 50 65 118 48 65 116 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 48 64 116 48 64 117 -+42 58 112 24 41 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 31 47 105 45 60 114 46 61 115 44 59 113 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+44 60 114 43 60 114 44 60 114 44 60 114 44 60 114 42 58 112 -+27 44 102 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 27 43 102 39 55 111 40 56 111 39 55 111 -+40 56 111 38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 -+38 54 110 39 55 111 34 50 107 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 25 42 100 33 49 106 35 51 108 35 51 108 35 51 108 -+35 51 108 35 51 108 34 50 107 34 50 107 31 47 105 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 101 26 43 101 35 52 107 56 71 121 64 78 127 63 77 126 -+63 77 126 63 77 126 63 77 126 64 78 127 64 78 127 63 77 126 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 63 77 126 63 77 126 63 77 126 64 78 127 64 78 127 -+64 78 127 64 78 127 65 79 128 65 79 128 65 79 128 64 78 127 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 64 78 127 64 78 127 64 78 127 64 78 127 63 77 126 -+63 77 126 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 63 77 126 64 78 127 63 77 126 -+63 77 126 63 77 126 63 77 126 63 77 126 63 77 126 46 61 115 -+28 45 102 25 42 101 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 27 44 102 51 66 119 -+59 74 124 61 75 125 59 74 124 61 75 125 61 75 125 61 75 125 -+61 75 125 60 75 125 61 75 125 60 75 125 60 75 125 59 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 59 74 124 60 75 125 59 74 124 58 73 123 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 58 73 123 59 74 124 58 73 123 58 73 123 57 72 122 -+58 73 123 58 73 123 57 72 122 58 73 123 58 73 123 33 49 106 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+37 53 109 56 70 122 56 70 122 55 69 121 56 70 122 56 70 122 -+56 70 122 56 70 122 55 70 121 56 70 122 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+54 69 120 55 70 121 53 68 119 53 68 119 54 69 120 54 69 120 -+54 69 120 54 69 120 53 68 119 54 69 120 46 61 115 25 42 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 25 42 101 49 64 117 50 65 118 49 64 117 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 -+50 65 118 49 65 117 48 65 116 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 48 64 117 48 64 117 47 63 116 -+28 45 103 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+25 43 102 39 55 110 46 61 115 45 60 114 44 59 113 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 -+43 60 114 43 60 114 44 60 114 43 59 113 44 60 114 36 52 108 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 34 50 107 40 56 111 39 55 110 40 56 111 -+39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 27 43 102 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 27 44 102 34 50 107 34 50 107 35 51 108 35 51 108 -+35 51 108 35 51 108 34 50 107 34 50 107 27 44 102 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 23 40 99 34 50 107 55 69 121 -+61 75 125 63 77 126 63 77 126 62 76 125 63 77 126 63 77 126 -+64 78 127 64 78 127 64 78 127 63 77 126 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 63 77 126 63 77 126 63 77 126 64 78 127 64 78 127 -+64 78 127 64 78 127 65 79 128 65 79 128 65 79 128 64 78 127 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 64 78 127 65 79 128 65 79 128 65 79 128 -+65 79 128 64 78 127 64 78 127 64 78 127 64 78 127 63 77 126 -+63 77 126 63 77 126 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 63 77 126 -+64 78 127 64 78 127 63 77 126 63 77 126 62 76 125 63 77 126 -+63 77 126 62 76 125 59 74 124 47 63 116 27 44 102 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 25 42 101 36 52 108 59 74 124 61 75 125 -+59 74 124 61 75 125 61 75 125 61 75 125 61 75 125 60 75 125 -+61 75 125 61 75 125 60 75 125 59 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 59 74 124 59 74 124 58 73 123 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 58 73 123 57 72 122 58 73 123 58 73 123 -+58 73 123 57 72 122 58 73 123 56 71 121 32 50 106 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 34 50 107 -+57 72 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 55 70 121 56 70 122 55 70 121 54 70 120 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 53 68 119 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 53 68 119 54 69 120 51 66 119 26 43 102 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 42 58 112 51 66 119 50 65 118 49 64 117 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 50 65 118 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 48 64 117 49 65 117 48 64 117 48 64 117 37 53 109 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+31 47 105 46 61 115 46 61 115 44 59 113 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 -+43 60 114 44 60 114 44 60 114 44 60 114 42 58 112 29 45 103 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 27 44 102 38 54 110 39 55 110 40 56 111 40 56 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 38 54 110 -+39 55 111 34 50 108 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 31 47 105 34 50 108 35 51 108 35 51 108 35 51 108 -+34 50 107 34 50 107 34 50 106 32 48 105 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 23 40 100 -+34 50 107 49 64 117 57 72 122 63 77 126 63 77 126 62 76 125 -+63 77 126 63 77 126 63 77 126 64 78 127 64 78 127 63 77 126 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 63 77 126 63 77 126 -+63 77 126 64 78 127 64 78 127 64 78 127 64 78 127 65 79 128 -+65 79 128 65 79 128 65 79 128 64 78 127 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 64 78 127 65 79 128 -+65 79 128 65 79 128 65 79 128 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 63 77 126 63 77 126 63 77 126 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 63 77 126 64 78 127 64 78 127 -+63 77 126 63 77 126 63 77 126 63 77 126 63 77 126 62 76 125 -+54 69 120 42 58 112 27 44 103 23 39 99 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 31 47 105 49 64 117 62 76 125 61 75 125 59 74 124 -+61 75 125 61 75 125 61 75 125 61 75 125 60 75 125 61 75 125 -+60 75 125 60 75 125 59 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 -+59 74 124 59 74 124 58 73 123 58 73 123 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 -+58 73 123 58 73 123 57 72 122 58 73 123 58 73 123 58 73 123 -+57 72 122 58 73 123 54 69 120 34 50 107 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 33 49 106 56 71 121 -+56 70 122 55 69 121 56 70 122 56 70 122 56 70 122 56 70 122 -+55 70 121 56 70 122 55 70 121 54 70 120 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 55 70 121 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+53 68 119 54 69 120 52 67 118 29 47 104 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 101 24 41 100 -+34 50 107 51 66 119 50 65 118 49 64 117 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 49 65 117 50 65 118 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 48 64 117 47 63 116 44 60 114 27 44 102 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 100 25 42 101 -+40 57 112 46 61 115 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 44 60 114 45 60 114 43 60 114 -+44 60 114 44 60 114 43 60 114 43 59 113 37 53 109 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 32 48 105 39 55 110 40 56 111 40 56 111 39 55 111 -+38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+38 54 110 30 46 104 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+26 43 101 33 49 106 35 51 108 35 51 108 35 51 108 35 51 108 -+35 51 108 34 50 107 34 50 107 29 46 104 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 24 41 100 31 47 105 40 56 111 55 70 121 64 78 127 -+63 77 126 62 76 125 63 77 126 63 77 126 63 77 126 64 78 127 -+64 78 127 63 77 126 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 63 77 126 63 77 126 63 77 126 63 77 126 64 78 127 -+64 78 127 64 78 127 64 78 127 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 64 78 127 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+64 78 127 65 79 128 65 79 128 65 79 128 65 79 128 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 63 77 126 63 77 126 -+63 77 126 63 77 126 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 63 77 126 64 78 127 64 78 127 63 77 126 63 77 126 -+62 76 125 63 77 126 64 78 127 61 75 125 48 63 117 36 52 108 -+27 44 102 23 40 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 23 40 100 25 42 101 -+43 58 114 57 72 122 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 60 75 125 61 75 125 61 75 125 60 75 125 -+59 75 125 59 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 60 75 125 -+59 74 124 58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 59 74 124 -+58 73 123 57 72 122 58 73 123 58 73 123 58 73 123 57 72 122 -+58 73 123 54 69 120 31 47 105 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 32 50 106 53 67 120 56 70 122 -+55 69 121 56 70 122 56 70 122 56 70 122 56 70 122 55 70 121 -+56 70 122 55 70 121 54 70 120 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 53 68 119 -+54 69 120 54 69 120 35 51 108 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 29 46 104 -+48 63 117 51 66 119 49 64 117 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 49 65 117 -+48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+48 64 117 49 65 117 48 64 116 48 64 117 34 50 106 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 33 49 106 -+46 61 115 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 44 60 114 45 60 114 44 60 114 43 60 114 -+44 60 114 44 60 114 44 60 113 43 60 114 27 44 102 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+26 43 102 37 53 109 40 56 111 39 55 111 40 56 111 39 55 111 -+38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+36 52 108 26 43 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+28 45 103 35 51 108 35 51 108 35 51 108 35 51 108 35 51 108 -+35 51 108 33 49 106 33 49 106 27 43 102 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 25 42 101 26 43 101 32 50 106 -+50 65 118 63 77 126 63 77 126 63 77 126 63 77 126 63 77 126 -+63 77 126 64 78 127 64 78 127 63 77 126 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 63 77 126 63 77 126 -+63 77 126 63 77 126 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 64 78 127 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+63 77 126 63 77 126 63 77 126 63 77 126 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 63 77 126 64 78 127 -+64 78 127 64 78 127 63 77 126 63 77 126 62 76 125 63 77 126 -+64 78 127 59 74 124 42 57 112 27 44 103 25 42 101 24 41 100 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 23 40 100 34 50 107 55 71 121 -+59 74 124 61 75 125 61 75 125 59 74 124 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 60 75 125 60 75 125 59 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 59 74 124 60 75 125 60 75 125 59 74 124 -+58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 58 73 123 59 74 124 58 73 123 -+57 72 122 58 73 123 58 73 123 58 73 123 57 72 122 58 73 123 -+51 67 118 28 45 103 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 29 46 104 53 67 120 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 55 70 121 56 70 122 -+55 70 121 54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 54 69 120 54 69 120 53 68 119 -+53 68 119 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 40 56 111 25 42 101 25 42 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 26 43 101 42 58 112 -+51 66 119 50 65 118 49 64 117 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 48 65 116 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 -+49 65 117 48 64 116 48 64 117 40 57 112 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 45 60 114 -+46 61 115 45 60 114 44 59 113 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 44 60 114 43 60 114 44 60 114 -+44 60 114 43 59 113 44 60 114 35 51 108 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+30 46 104 40 56 111 40 56 111 40 56 111 39 55 111 38 54 111 -+38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 38 54 110 -+32 48 107 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+32 48 105 35 51 108 34 50 107 35 51 108 35 51 108 34 50 107 -+35 51 108 33 49 106 31 47 105 25 42 101 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+23 40 100 27 44 103 45 60 114 58 73 123 61 75 125 62 76 125 -+63 77 126 62 76 125 63 77 126 63 77 126 63 77 126 64 78 127 -+64 78 127 64 78 127 63 77 126 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 63 77 126 63 77 126 63 77 126 63 77 126 63 77 126 -+63 77 126 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 63 77 126 63 77 126 63 77 126 63 77 126 -+63 77 126 63 77 126 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 63 77 126 63 77 126 63 77 126 -+62 76 125 63 77 126 63 77 126 62 76 125 61 75 125 53 67 120 -+36 52 108 24 41 100 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 25 42 101 27 44 103 46 61 115 61 75 125 61 75 125 -+59 74 124 61 75 125 61 75 125 61 75 125 61 75 125 60 75 125 -+61 75 125 60 75 125 60 75 125 59 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 59 74 124 60 75 125 59 74 124 58 73 123 58 73 123 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 58 73 123 58 73 123 58 73 123 58 73 123 57 72 122 -+58 73 123 58 73 123 57 72 122 58 73 123 58 73 123 49 64 117 -+27 43 102 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 27 44 103 51 66 119 56 70 122 55 69 121 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 55 70 121 -+54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 54 69 120 55 70 121 54 69 120 53 68 119 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 53 68 119 54 69 120 -+47 63 116 25 42 102 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 34 50 107 51 66 119 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 49 65 117 48 65 116 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+48 64 116 48 64 117 47 63 116 26 43 102 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 37 53 109 46 61 115 -+45 60 114 44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 44 60 114 43 60 114 44 60 114 -+43 59 113 44 60 114 43 59 113 25 42 101 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 -+37 53 109 40 56 111 40 56 111 39 55 111 39 55 111 38 54 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 38 54 110 -+25 43 102 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 26 43 101 -+35 51 108 34 50 107 35 51 108 35 51 108 34 50 107 35 51 108 -+34 50 107 33 49 106 28 45 103 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 100 24 41 100 23 40 99 24 41 100 36 52 108 48 63 117 -+56 71 121 62 76 125 64 78 127 63 77 126 62 76 125 63 77 126 -+63 77 126 63 77 126 64 78 127 64 78 127 64 78 127 63 77 126 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 63 77 126 63 77 126 63 77 126 63 77 126 63 77 126 -+63 77 126 63 77 126 63 77 126 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 63 77 126 -+63 77 126 63 77 126 63 77 126 63 77 126 63 77 126 63 77 126 -+63 77 126 63 77 126 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 63 77 126 64 78 127 64 78 127 -+63 77 126 63 77 126 63 77 126 62 76 125 63 77 126 63 77 126 -+64 78 127 59 74 124 53 67 120 44 59 113 29 47 104 23 39 99 -+23 40 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 23 40 100 -+27 44 103 39 55 110 56 70 122 62 76 125 61 75 125 59 74 124 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+60 75 125 59 75 125 59 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 -+60 75 125 60 75 125 59 74 124 58 73 123 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+58 73 123 59 74 124 58 73 123 57 72 122 57 72 122 58 73 123 -+58 73 123 57 72 122 58 73 123 58 73 123 46 61 115 26 44 102 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+29 46 104 51 66 119 56 70 122 55 69 121 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 55 70 121 55 70 121 55 70 121 -+54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 54 69 120 53 68 119 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 53 68 119 54 69 120 50 65 118 -+28 45 103 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 28 45 103 50 65 118 51 66 119 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 49 65 117 50 65 118 48 65 116 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 49 65 117 -+48 64 117 48 64 117 34 50 107 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 29 46 104 44 60 114 46 61 115 -+44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 44 60 114 43 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 33 49 106 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 29 46 104 -+40 57 112 39 55 110 39 55 111 40 56 111 38 54 111 39 55 111 -+39 55 111 39 55 111 39 55 111 38 54 110 39 55 111 32 50 106 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 31 47 105 -+35 51 108 35 51 108 35 51 108 35 51 108 35 51 108 34 50 107 -+34 50 107 33 49 106 25 42 101 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 24 41 100 -+29 46 104 35 51 108 44 61 114 57 72 122 64 78 127 64 78 127 -+63 77 126 63 77 126 63 77 126 63 77 126 63 77 126 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 63 77 126 63 77 126 63 77 126 -+63 77 126 63 77 126 63 77 126 63 77 126 63 77 126 63 77 126 -+63 77 126 63 77 126 63 77 126 63 77 126 63 77 126 63 77 126 -+63 77 126 63 77 126 63 77 126 63 77 126 63 77 126 63 77 126 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+63 77 126 64 78 127 64 78 127 64 78 127 63 77 126 63 77 126 -+63 77 126 62 76 125 63 77 126 64 78 127 63 77 126 52 67 118 -+40 56 111 32 50 106 26 43 102 23 40 100 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 23 40 100 37 53 109 -+52 67 118 61 75 125 61 75 125 59 74 124 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 59 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 60 75 125 -+59 74 124 59 74 124 58 73 123 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 -+59 74 124 58 73 123 57 72 122 58 73 123 58 73 123 58 73 123 -+57 72 122 58 73 123 59 74 124 40 57 112 25 42 101 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 29 46 104 -+50 65 118 56 70 122 55 69 121 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 55 70 121 56 70 122 55 70 121 54 70 120 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+54 69 120 55 70 121 54 69 120 53 68 119 54 69 120 54 69 120 -+54 69 120 54 69 120 53 68 119 54 69 120 52 67 118 31 47 105 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 25 42 101 47 63 116 51 66 119 50 65 118 -+49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+49 65 117 50 65 118 49 65 117 48 65 116 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 48 64 116 -+48 64 117 40 57 112 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 25 42 101 38 54 110 46 61 115 45 60 114 -+44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 44 60 114 44 60 114 43 60 114 44 60 114 43 59 113 -+44 60 114 40 56 111 26 43 102 25 42 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 42 100 38 54 110 -+40 56 111 40 56 111 40 56 111 39 55 111 38 54 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 38 54 110 25 42 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 34 50 107 -+35 51 108 35 51 108 35 51 108 35 51 108 35 51 108 34 50 107 -+34 50 107 30 46 104 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 24 41 100 25 42 101 26 43 102 33 49 106 47 63 116 -+61 75 125 64 78 127 63 77 126 63 77 126 63 77 126 63 77 126 -+63 77 126 63 77 126 64 78 127 64 78 127 64 78 127 63 77 126 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 63 77 126 64 78 127 64 78 127 -+64 78 127 63 77 126 63 77 126 63 77 126 63 77 126 63 77 126 -+63 77 126 63 77 126 54 69 120 40 56 111 27 44 103 26 43 101 -+25 42 101 24 41 100 24 41 100 25 42 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 23 40 99 31 47 105 52 67 118 59 74 124 -+61 75 125 61 75 125 59 74 124 61 75 125 61 75 125 61 75 125 -+61 75 125 60 75 125 61 75 125 61 75 125 60 75 125 59 75 125 -+59 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 59 74 124 60 75 125 59 74 124 -+58 73 123 58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+58 73 123 57 72 122 58 73 123 58 73 123 58 73 123 58 73 123 -+58 73 123 57 72 122 36 52 108 25 42 101 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 27 44 102 50 65 118 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 55 70 121 56 70 122 55 70 121 54 70 120 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 54 69 120 53 68 119 53 68 119 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 55 68 119 33 49 106 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 23 40 100 42 57 112 51 66 119 50 65 118 49 64 117 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 49 65 117 48 65 116 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 48 64 117 49 65 117 48 63 117 -+46 61 115 30 46 104 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 101 29 46 104 44 61 114 46 61 115 44 59 113 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+44 60 114 45 60 114 43 60 114 44 60 114 44 60 114 44 60 114 -+43 59 113 32 50 106 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 31 47 105 40 56 111 -+39 55 110 39 55 111 40 56 111 38 54 111 39 55 111 39 55 111 -+39 55 111 39 55 111 38 54 110 39 55 111 32 48 105 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 30 46 104 35 51 108 -+34 50 107 35 51 108 35 51 108 34 50 107 35 51 108 34 50 107 -+34 50 107 25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+36 52 108 25 42 101 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+23 40 100 33 49 106 47 63 116 58 73 123 61 75 125 62 76 125 -+63 77 126 63 77 126 63 77 126 62 76 125 63 77 126 63 77 126 -+63 77 126 63 77 126 64 78 127 64 78 127 64 78 127 64 78 127 -+63 77 126 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+63 77 126 63 77 126 63 77 126 63 77 126 62 76 125 62 76 125 -+63 77 126 63 77 126 62 76 125 61 75 125 60 75 125 54 69 120 -+40 56 111 27 44 102 23 40 99 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+25 42 101 28 45 103 46 61 115 61 75 125 61 75 125 59 74 124 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 59 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 59 74 124 60 75 125 59 74 124 58 73 123 58 73 123 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 58 73 123 59 74 124 58 73 123 57 72 122 -+57 72 122 58 73 123 58 73 123 57 72 122 57 72 122 58 73 123 -+55 70 121 35 52 107 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 26 43 101 50 65 118 56 70 122 -+55 69 121 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 55 70 121 54 70 120 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 55 70 121 -+54 69 120 53 68 119 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 53 68 119 39 55 110 24 41 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 34 50 107 50 65 118 50 65 118 49 64 117 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 49 65 117 48 65 116 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 48 64 116 48 64 117 -+37 53 109 23 40 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 25 42 101 40 56 111 46 61 115 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 -+45 60 114 43 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+40 56 111 25 43 102 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 25 42 101 38 54 109 39 55 110 -+39 55 111 40 56 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 38 54 110 39 55 111 38 54 110 26 43 102 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 25 42 101 34 50 107 34 50 107 -+35 51 108 35 51 108 35 51 108 35 51 108 34 50 107 34 50 107 -+31 47 105 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+62 76 125 51 66 119 36 52 108 26 43 101 23 40 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 23 40 99 23 40 100 32 50 106 42 58 112 -+50 65 118 56 71 121 59 74 124 64 78 127 63 77 126 63 77 126 -+63 77 126 63 77 126 63 77 126 63 77 126 63 77 126 63 77 126 -+64 78 127 64 78 127 64 78 127 64 78 127 63 77 126 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 63 77 126 63 77 126 63 77 126 63 77 126 -+63 77 126 62 76 125 63 77 126 63 77 126 64 78 127 63 77 126 -+58 73 123 53 68 119 47 63 116 37 53 109 28 45 102 23 39 99 -+23 40 100 24 41 100 24 41 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 23 40 100 29 47 104 -+42 58 112 58 73 123 62 76 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 60 75 125 61 75 125 61 75 125 -+60 75 125 59 75 125 59 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 59 74 124 58 73 123 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 58 73 123 59 74 124 58 73 123 57 72 122 58 73 123 -+58 73 123 58 73 123 57 72 122 58 73 123 59 74 124 51 66 119 -+31 47 105 23 40 99 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 28 45 103 49 64 117 57 72 122 55 69 121 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 55 70 121 -+55 70 121 55 70 121 54 70 120 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 54 69 120 55 70 121 54 69 120 -+53 68 119 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+53 68 119 54 69 120 43 59 113 25 42 101 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+28 45 103 47 63 116 51 66 119 49 64 117 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 50 65 118 -+49 65 117 48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 48 64 117 49 65 117 48 64 116 48 64 117 43 60 114 -+24 41 101 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 32 50 106 47 63 116 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 45 60 114 -+44 60 114 43 60 114 44 60 114 44 60 114 43 59 113 44 60 114 -+31 47 105 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 31 47 105 39 55 110 40 56 111 -+40 56 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 32 50 106 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 28 45 103 34 50 107 35 51 108 -+35 51 108 35 51 108 35 51 108 34 50 107 34 50 107 34 50 107 -+26 43 102 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+61 75 125 61 75 125 59 74 124 51 66 119 38 54 109 24 41 100 -+23 40 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 23 40 100 -+24 41 100 29 45 103 34 50 106 39 55 110 47 63 116 55 70 121 -+63 77 126 65 79 128 64 78 127 63 77 126 62 76 125 63 77 126 -+63 77 126 63 77 126 63 77 126 63 77 126 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 63 77 126 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 63 77 126 63 77 126 -+63 77 126 63 77 126 63 77 126 62 76 125 63 77 126 63 77 126 -+64 78 127 64 78 127 59 74 124 51 66 119 43 59 113 36 52 108 -+31 47 105 27 43 102 23 40 100 24 41 100 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 23 40 99 29 46 103 45 60 114 56 71 121 -+62 76 125 61 75 125 59 74 124 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 60 75 125 60 75 125 -+59 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 -+59 74 124 59 74 124 59 74 124 58 73 123 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 58 73 123 57 72 122 58 73 123 58 73 123 -+58 73 123 58 73 123 58 73 123 58 73 123 44 61 114 28 45 103 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 29 46 103 49 64 117 56 70 122 55 69 121 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 55 70 121 56 70 122 -+55 70 121 54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 54 69 120 55 70 121 54 69 120 53 68 119 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 53 68 119 -+55 70 121 44 61 114 26 43 101 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+44 60 114 51 66 119 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 -+48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 48 64 117 48 64 117 47 63 116 28 45 103 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+27 43 102 45 60 114 45 60 114 45 60 114 44 59 113 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 43 59 113 44 60 114 39 55 110 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 26 43 101 36 52 108 40 56 111 39 55 111 -+40 56 111 39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 38 54 110 28 45 103 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 25 42 101 32 48 107 35 51 108 35 51 108 -+35 51 108 35 51 108 34 50 107 35 51 108 34 50 106 31 47 105 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+61 75 125 59 74 124 61 75 125 61 75 125 59 74 124 54 69 120 -+34 50 107 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 24 41 100 24 41 100 25 42 101 26 43 102 -+28 45 103 36 52 108 44 61 114 56 71 121 64 78 127 64 78 127 -+63 77 126 63 77 126 63 77 126 63 77 126 63 77 126 63 77 126 -+63 77 126 63 77 126 63 77 126 63 77 126 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 63 77 126 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 -+64 78 127 64 78 127 64 78 127 64 78 127 64 78 127 63 77 126 -+63 77 126 63 77 126 63 77 126 63 77 126 63 77 126 62 76 125 -+63 77 126 63 77 126 64 78 127 64 78 127 61 75 125 51 67 118 -+40 57 112 31 47 105 27 44 102 26 43 102 25 42 101 24 41 100 -+24 41 100 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+23 40 100 25 42 101 45 60 114 58 73 123 59 74 124 61 75 125 -+60 75 125 59 74 124 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 60 75 125 60 75 125 60 75 125 60 75 125 59 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 59 74 124 60 75 125 60 75 125 -+59 74 124 58 73 123 58 73 123 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 -+58 73 123 58 73 123 58 73 123 57 72 122 58 73 123 58 73 123 -+58 73 123 57 72 122 57 72 122 40 57 112 25 42 101 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+28 45 103 50 65 118 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 55 70 121 56 70 122 55 70 121 -+54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 54 69 120 53 68 119 53 68 119 -+54 69 120 54 69 120 54 69 120 54 69 120 53 68 119 54 69 120 -+48 64 117 26 43 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 23 40 100 39 55 110 -+51 66 119 50 65 118 49 64 117 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 49 65 117 50 65 118 48 65 116 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 48 64 117 48 64 116 48 64 117 34 50 107 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+39 55 111 46 61 115 45 60 114 44 59 113 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 44 60 114 45 60 114 44 60 114 -+43 60 114 44 60 114 44 60 114 44 60 114 44 60 114 27 44 102 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 101 30 46 104 40 56 111 40 56 111 40 56 111 -+39 55 111 38 54 111 38 54 111 39 55 111 39 55 111 39 55 111 -+39 55 111 38 54 110 35 52 107 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 27 44 102 34 50 107 35 51 108 35 51 108 -+35 51 108 35 51 108 35 51 108 34 50 107 34 50 107 27 44 103 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+61 75 125 61 75 125 61 75 125 61 75 125 59 74 124 61 75 125 -+62 76 125 53 68 119 34 50 106 25 42 101 25 42 100 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 24 41 100 23 40 100 24 41 101 32 48 105 -+40 57 112 49 64 117 57 72 122 59 74 124 61 75 125 61 75 125 -+62 76 125 63 77 126 63 77 126 63 77 126 63 77 126 63 77 126 -+63 77 126 62 76 125 62 76 125 63 77 126 63 77 126 63 77 126 -+63 77 126 63 77 126 63 77 126 63 77 126 63 77 126 63 77 126 -+63 77 126 63 77 126 63 77 126 63 77 126 63 77 126 63 77 126 -+63 77 126 63 77 126 63 77 126 63 77 126 63 77 126 63 77 126 -+63 77 126 63 77 126 63 77 126 63 77 126 63 77 126 63 77 126 -+63 77 126 63 77 126 63 77 126 63 77 126 63 77 126 62 76 125 -+62 76 125 62 76 125 63 77 126 63 77 126 63 77 126 63 77 126 -+63 77 126 62 76 125 62 76 125 61 75 125 59 74 124 59 74 124 -+54 69 120 44 61 114 37 53 109 27 44 103 23 40 100 23 40 100 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 25 42 101 28 45 103 -+43 58 114 61 75 125 61 75 125 61 75 125 59 74 124 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+60 75 125 60 75 125 59 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 59 74 124 60 75 125 60 75 125 59 74 124 58 73 123 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 58 73 123 59 74 124 59 74 124 58 73 123 -+57 72 122 58 73 123 58 73 123 58 73 123 57 72 122 58 73 123 -+58 73 123 56 71 121 36 52 108 23 40 99 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 27 44 103 -+51 66 119 56 70 122 55 69 121 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 55 70 121 54 70 120 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+54 69 120 55 70 121 54 69 120 53 68 119 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 53 68 119 54 69 120 50 65 118 -+28 45 103 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 33 49 106 51 66 119 -+50 65 118 49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 -+49 65 117 48 64 117 48 64 117 40 57 112 26 43 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 31 47 105 -+44 60 114 45 60 114 44 59 113 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 43 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 35 52 107 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 25 42 101 36 52 108 40 56 111 40 56 111 39 55 111 -+39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 38 54 110 28 45 103 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 29 47 104 35 51 108 34 50 107 35 51 108 -+35 51 108 34 50 107 35 51 108 33 49 106 32 48 107 26 43 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+59 74 124 61 75 125 62 76 125 51 66 119 38 54 109 29 45 103 -+23 40 100 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+23 40 100 23 40 99 23 39 99 26 44 102 32 50 106 38 54 109 -+43 58 114 48 63 117 51 66 119 54 69 120 56 71 121 58 73 123 -+61 75 125 63 77 126 64 78 127 64 78 127 64 78 127 63 77 126 -+63 77 126 63 77 126 63 77 126 63 77 126 63 77 126 63 77 126 -+63 77 126 62 76 125 62 76 125 62 76 125 62 76 125 62 76 125 -+62 76 125 62 76 125 62 76 125 62 76 125 62 76 125 62 76 125 -+62 76 125 63 77 126 63 77 126 63 77 126 63 77 126 63 77 126 -+63 77 126 63 77 126 63 77 126 63 77 126 64 78 127 64 78 127 -+64 78 127 62 76 125 59 74 124 57 72 122 55 70 121 53 67 120 -+50 65 118 46 61 115 40 56 111 36 52 108 30 46 104 24 41 100 -+23 39 99 23 40 99 23 40 100 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 23 40 100 25 42 101 33 49 106 43 59 113 58 73 123 -+62 76 125 61 75 125 59 74 124 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 60 75 125 61 75 125 60 75 125 60 75 125 -+60 75 125 59 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 -+60 75 125 60 75 125 59 74 124 59 74 124 58 73 123 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 58 73 123 58 73 123 57 72 122 -+58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 -+50 65 118 29 47 104 23 40 99 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 31 47 105 51 66 119 -+56 70 122 55 69 121 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 55 70 121 55 70 121 55 70 121 54 70 120 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 -+55 70 121 54 69 120 53 68 119 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 53 68 119 54 69 120 52 66 118 33 49 106 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 29 46 104 48 63 117 51 66 119 -+49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 49 65 117 50 65 118 49 65 117 48 65 116 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+48 64 117 48 63 117 46 61 115 29 46 104 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 26 43 101 40 56 111 -+46 61 115 45 60 114 44 59 113 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 44 60 114 44 60 114 43 60 114 -+44 60 114 43 59 113 44 60 114 40 57 112 27 43 102 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 29 46 103 40 57 112 39 55 110 39 55 111 40 56 111 -+38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 38 54 110 -+39 55 111 35 51 108 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 25 42 101 34 50 107 35 51 108 35 51 108 35 51 108 -+35 51 108 35 51 108 34 50 107 33 49 106 29 47 104 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+61 75 125 60 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 54 69 120 -+44 60 114 30 46 104 23 40 99 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 24 41 100 24 41 100 -+23 40 100 23 40 100 25 42 101 27 44 102 30 46 104 32 48 105 -+34 50 107 36 52 108 39 55 110 42 57 112 45 60 114 48 63 117 -+50 65 118 53 67 120 56 71 121 57 72 122 59 74 124 61 75 125 -+63 77 126 64 78 127 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 65 79 128 -+65 79 128 64 78 127 62 76 125 61 75 125 58 73 123 57 72 122 -+55 69 121 52 67 118 49 65 117 47 63 116 44 59 113 40 56 111 -+37 53 109 35 51 108 33 49 106 31 47 105 29 45 103 26 43 101 -+24 41 100 23 40 99 23 40 100 24 41 100 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 23 40 100 -+24 41 100 37 53 109 49 64 117 58 73 123 62 76 125 61 75 125 -+59 74 124 60 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+60 75 125 61 75 125 61 75 125 60 75 125 60 75 125 59 75 125 -+59 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 60 75 125 -+59 74 124 59 74 124 58 73 123 58 73 123 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+58 73 123 59 74 124 58 73 123 58 73 123 57 72 122 57 72 122 -+58 73 123 58 73 123 57 72 122 58 73 123 58 73 123 43 59 113 -+27 44 102 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 32 48 107 51 66 119 56 70 122 -+55 69 121 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+55 70 121 56 70 122 55 70 121 54 70 120 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 55 70 121 -+54 69 120 53 68 119 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 53 67 120 54 69 120 54 69 120 34 50 107 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 26 43 101 44 60 114 51 66 119 50 65 118 -+49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 49 65 117 49 65 117 48 65 116 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 49 65 117 -+48 64 116 48 64 117 34 50 107 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 33 49 106 46 61 115 -+45 60 114 44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 44 60 114 45 60 114 43 60 114 44 60 114 -+44 60 114 44 60 114 43 59 113 34 50 106 24 41 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 101 38 54 110 40 56 111 40 56 111 40 56 111 39 55 111 -+38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 27 44 102 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 30 46 104 35 51 108 34 50 107 35 51 108 35 51 108 -+34 50 107 35 51 108 34 50 107 33 49 106 26 43 102 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+60 75 125 61 75 125 61 75 125 60 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 59 74 124 61 75 125 61 75 125 -+59 74 124 58 73 123 49 64 117 29 47 104 23 40 100 24 41 100 -+25 42 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 -+24 41 100 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+26 43 101 26 43 102 27 43 102 27 44 102 27 44 102 27 44 102 -+27 44 102 27 44 103 28 45 103 29 46 104 30 46 104 31 47 105 -+31 47 105 31 47 105 31 47 105 30 46 104 30 46 104 28 45 103 -+27 44 103 27 44 102 27 44 102 27 44 102 27 44 102 27 43 102 -+26 43 102 26 43 102 26 43 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 24 41 101 38 56 110 -+56 70 122 59 74 124 61 75 125 61 75 125 59 74 124 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 60 75 125 -+61 75 125 60 75 125 60 75 125 59 75 125 59 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 59 74 124 60 75 125 59 74 124 -+58 73 123 58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 -+59 74 124 58 73 123 58 73 123 57 72 122 58 73 123 58 73 123 -+58 73 123 57 72 122 58 73 123 58 73 123 36 52 108 24 41 101 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 31 47 105 54 69 120 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 55 70 121 -+56 70 122 55 70 121 54 70 120 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 -+53 68 119 53 68 119 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 55 70 121 34 50 107 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 39 55 110 51 66 119 50 65 118 49 64 117 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+49 65 117 50 65 118 48 65 116 48 65 116 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 48 64 117 49 65 117 48 64 116 -+48 64 117 40 57 112 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 25 42 101 44 60 114 46 61 115 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 44 60 114 45 60 114 44 60 114 43 60 114 44 60 114 -+44 60 114 44 60 114 40 56 111 25 42 101 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+32 48 105 40 56 111 39 55 110 39 55 111 40 56 111 38 54 111 -+39 55 111 39 55 111 39 55 111 39 55 111 38 54 110 39 55 111 -+34 50 107 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+25 42 101 35 52 107 35 51 108 35 51 108 35 51 108 35 51 108 -+35 51 108 34 50 107 34 50 107 31 47 105 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+59 75 125 59 75 125 60 75 125 60 75 125 61 75 125 61 75 125 -+60 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+59 74 124 59 74 124 61 75 125 62 76 125 52 67 118 34 50 107 -+26 43 102 25 42 101 24 41 100 24 41 100 25 42 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 24 41 100 24 41 100 -+24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+24 41 100 26 43 101 28 45 103 42 58 112 59 74 124 61 75 125 -+61 75 125 59 74 124 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 60 75 125 60 75 125 -+59 75 125 59 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+59 74 124 60 75 125 59 74 124 59 74 124 58 73 123 58 73 123 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 58 73 123 58 73 123 58 73 123 -+58 73 123 57 72 122 58 73 123 58 73 123 58 73 123 57 72 122 -+58 73 123 58 73 123 52 67 118 28 45 104 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 33 49 106 56 70 122 56 70 122 55 69 121 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+55 70 121 54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 54 69 120 55 70 121 54 69 120 -+53 68 119 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 37 53 109 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 33 49 106 53 67 120 50 65 118 49 64 117 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 -+50 65 118 48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 48 64 117 48 64 116 48 64 117 -+46 61 115 26 43 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 39 55 111 46 61 115 45 60 114 -+44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+44 60 114 45 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 43 59 113 31 47 105 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 -+38 54 110 39 55 110 39 55 111 40 56 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 38 54 110 39 55 111 38 54 110 -+27 44 102 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 101 24 41 100 -+29 46 104 35 51 108 35 51 108 35 51 108 35 51 108 35 51 108 -+35 51 108 34 50 107 34 50 107 27 44 102 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+60 75 125 60 75 125 59 75 125 59 75 125 60 75 125 60 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 59 74 124 61 75 125 62 76 125 -+55 69 121 42 57 112 33 49 106 26 43 101 23 40 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 24 41 100 29 46 104 -+36 52 108 48 63 117 59 74 124 62 76 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+60 75 125 61 75 125 60 75 125 60 75 125 60 75 125 59 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 -+60 75 125 59 74 124 59 74 124 58 73 123 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 58 73 123 59 74 124 59 74 124 58 73 123 57 72 122 -+57 72 122 58 73 123 58 73 123 58 73 123 57 72 122 58 73 123 -+57 72 122 44 60 114 26 43 102 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 -+37 53 109 56 70 122 56 70 122 55 69 121 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 55 70 121 55 70 121 55 70 121 -+54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 54 69 120 55 70 121 54 69 120 53 68 119 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 53 68 119 -+53 68 119 40 56 111 25 42 101 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+31 47 105 51 66 119 50 65 118 49 64 117 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 50 65 118 -+49 65 117 48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 48 64 117 49 65 116 48 64 117 47 63 116 -+31 47 105 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 100 24 41 100 32 48 107 46 61 115 45 60 114 45 60 114 -+44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 44 60 114 44 60 114 44 60 114 44 60 114 43 59 113 -+44 60 114 38 56 110 23 40 100 25 42 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 32 48 105 -+39 55 110 40 56 111 40 56 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 33 49 106 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 -+34 50 107 34 50 107 35 51 108 35 51 108 35 51 108 35 51 108 -+34 50 107 34 50 107 32 48 105 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+60 75 125 60 75 125 60 75 125 60 75 125 59 75 125 60 75 125 -+60 75 125 61 75 125 61 75 125 60 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 59 74 124 61 75 125 -+61 75 125 62 76 125 58 73 123 51 66 119 40 57 112 29 46 104 -+23 39 99 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 23 40 99 24 41 100 35 51 108 47 63 116 55 69 121 -+61 75 125 61 75 125 61 75 125 59 74 124 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 60 75 125 61 75 125 -+61 75 125 60 75 125 60 75 125 59 75 125 59 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 59 74 124 60 75 125 60 75 125 -+59 74 124 59 74 124 58 73 123 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+58 73 123 59 74 124 58 73 123 58 73 123 57 72 122 58 73 123 -+58 73 123 58 73 123 57 72 122 57 72 122 59 74 124 54 69 120 -+34 50 107 25 42 101 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 101 25 42 100 40 57 112 -+55 69 121 56 70 122 55 69 121 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 55 70 121 56 70 122 55 70 121 54 70 120 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 54 69 120 55 70 121 54 69 120 53 68 119 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 53 68 119 54 69 120 -+40 57 112 25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 29 46 104 -+47 63 116 51 66 119 50 65 118 49 64 117 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 49 65 117 50 65 118 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 48 64 117 49 65 117 48 64 117 48 63 117 37 53 109 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 27 44 102 43 58 114 45 60 114 45 60 114 44 59 113 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 -+45 60 114 44 60 114 43 60 114 44 60 114 44 60 114 44 60 114 -+43 59 113 26 43 102 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 26 43 102 38 54 109 -+40 56 111 39 55 111 40 56 111 39 55 111 38 54 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 37 53 109 28 45 103 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 29 45 103 -+34 50 107 34 50 108 35 51 108 35 51 108 35 51 108 34 50 107 -+34 50 107 34 50 107 27 44 102 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 59 75 125 -+59 75 125 60 75 125 60 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 59 74 124 61 75 125 61 75 125 59 74 124 58 73 123 -+51 66 119 36 52 108 24 41 100 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 23 40 100 -+27 44 103 43 60 114 56 71 121 59 74 124 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 60 75 125 61 75 125 60 75 125 -+60 75 125 59 75 125 59 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 59 74 124 -+58 73 123 58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 -+59 74 124 58 73 123 57 72 122 57 72 122 58 73 123 58 73 123 -+58 73 123 58 73 123 58 73 123 59 74 124 46 61 115 27 44 102 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 101 24 41 100 45 60 114 56 70 122 -+56 70 122 55 69 121 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 55 70 121 56 70 122 55 70 121 54 70 120 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+54 69 120 55 70 121 54 69 120 53 68 119 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 53 68 119 55 70 121 43 59 113 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 26 43 101 43 59 113 -+51 66 119 50 65 118 49 64 117 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 48 65 116 -+48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+48 64 117 49 65 117 48 64 117 47 63 116 43 59 113 25 42 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+25 42 100 37 53 109 46 61 115 46 61 115 44 59 113 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+44 60 114 43 60 114 43 60 114 44 60 114 43 59 113 44 61 114 -+32 50 106 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 32 48 105 40 56 111 -+40 56 111 40 56 111 39 55 111 38 54 111 38 54 111 39 55 111 -+39 55 111 39 55 111 39 55 111 38 54 110 34 50 107 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 32 48 107 -+35 51 108 35 51 108 35 51 108 35 51 108 35 51 108 34 50 107 -+34 50 107 32 48 105 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 59 75 125 59 75 125 59 75 125 60 75 125 -+60 75 125 61 75 125 61 75 125 60 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 59 74 124 -+61 75 125 62 76 125 58 73 123 46 61 115 31 47 105 26 43 102 -+25 42 101 24 41 100 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+24 41 100 25 42 100 26 43 101 28 45 103 38 54 110 53 67 120 -+62 76 125 61 75 125 61 75 125 59 74 124 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 60 75 125 -+61 75 125 60 75 125 60 75 125 60 75 125 59 75 125 59 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 -+60 75 125 59 74 124 59 74 124 58 73 123 58 73 123 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 58 73 123 59 74 124 59 74 124 58 73 123 -+57 72 122 57 72 122 58 73 123 58 73 123 58 73 123 57 72 122 -+58 73 123 58 73 123 55 70 121 38 54 109 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 26 43 101 48 63 117 56 70 122 55 69 121 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 55 70 121 54 70 120 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 -+55 70 121 54 69 120 53 68 119 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 44 60 114 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 25 42 101 38 54 110 53 67 120 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 49 65 117 49 65 117 48 65 116 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 -+49 65 117 48 64 116 48 64 117 47 63 116 28 45 103 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+29 46 104 45 60 114 46 61 115 44 59 113 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 44 60 114 -+43 60 114 44 60 114 44 60 114 44 60 114 44 60 114 39 55 111 -+26 43 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 25 42 101 39 55 110 40 56 111 -+39 55 111 39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 38 54 110 27 44 103 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 27 44 102 34 50 108 -+35 51 108 35 51 108 35 51 108 35 51 108 35 51 108 34 50 107 -+34 50 107 28 45 103 24 41 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 59 75 125 -+59 75 125 60 75 125 60 75 125 61 75 125 61 75 125 60 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 59 74 124 61 75 125 62 76 125 62 76 125 55 69 121 -+44 60 114 35 51 108 29 47 104 25 42 100 23 40 100 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 100 24 41 100 24 41 100 23 40 100 27 44 102 -+32 50 106 39 55 110 49 64 117 59 74 124 63 77 126 61 75 125 -+59 74 124 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 60 75 125 61 75 125 61 75 125 61 75 125 -+60 75 125 60 75 125 59 75 125 59 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+59 74 124 58 73 123 58 73 123 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 58 73 123 59 74 124 58 73 123 58 73 123 57 72 122 -+58 73 123 58 73 123 58 73 123 58 73 123 57 72 122 58 73 123 -+58 73 123 48 63 117 31 47 105 23 40 99 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 30 46 104 50 65 118 56 70 122 55 69 121 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 55 70 121 56 70 122 -+55 70 121 55 70 121 54 70 120 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 54 69 120 55 70 121 55 70 121 -+54 69 120 53 68 119 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 53 68 119 54 69 120 45 60 114 25 42 101 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 36 52 108 52 67 118 50 65 118 -+49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 49 65 117 50 65 118 49 65 117 48 65 116 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+48 64 116 48 64 117 48 64 117 32 50 106 23 40 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 -+40 57 112 46 61 115 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 44 60 114 45 60 114 44 60 114 -+43 60 114 44 60 114 44 60 114 44 60 114 43 59 113 31 47 105 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 101 24 41 100 34 50 107 40 56 111 39 55 110 -+40 56 111 39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 -+39 55 111 38 54 110 39 55 111 34 50 106 23 40 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 31 47 105 35 51 108 -+34 50 107 35 51 108 35 51 108 34 50 107 35 51 108 33 49 106 -+32 48 107 25 43 102 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+59 75 125 59 75 125 60 75 125 60 75 125 60 75 125 61 75 125 -+61 75 125 60 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+62 76 125 59 74 124 55 70 121 49 64 117 40 57 112 31 47 105 -+24 40 99 23 40 99 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+23 40 100 23 39 99 27 44 102 36 52 108 46 61 115 52 67 118 -+58 73 123 62 76 125 61 75 125 61 75 125 59 74 124 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 60 75 125 61 75 125 60 75 125 60 75 125 60 75 125 -+59 75 125 59 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 59 74 124 60 75 125 59 74 124 59 74 124 -+59 74 124 58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+58 73 123 59 74 124 58 73 123 58 73 123 57 72 122 57 72 122 -+58 73 123 58 73 123 58 73 123 57 72 122 58 73 123 55 70 121 -+38 54 110 25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 23 40 100 -+34 50 107 51 66 119 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 55 70 121 56 70 122 55 70 121 -+55 70 121 54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 54 69 120 55 70 121 54 69 120 54 69 120 -+53 68 119 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+53 68 119 54 69 120 44 61 114 27 44 102 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 23 40 100 34 50 107 50 65 118 50 65 118 50 65 118 -+49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+49 65 117 50 65 118 49 65 117 48 65 116 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 49 65 117 -+48 64 116 49 65 117 37 53 109 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 23 40 100 36 52 108 -+46 61 115 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 43 60 114 -+44 60 114 44 60 114 44 60 114 43 59 113 38 54 110 25 42 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 28 45 103 39 55 111 39 55 111 39 55 111 -+40 56 111 38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 38 54 110 25 42 101 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 27 44 102 35 51 108 35 51 108 -+35 51 108 35 51 108 35 51 108 35 51 108 34 50 107 33 49 106 -+30 46 104 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+60 75 125 60 75 125 59 74 124 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 59 75 125 59 75 125 60 75 125 60 75 125 -+60 75 125 61 75 125 61 75 125 60 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+59 74 124 61 75 125 61 75 125 61 75 125 59 74 124 58 73 123 -+57 72 122 46 61 115 34 50 107 24 41 101 23 40 100 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 23 40 99 28 45 103 -+39 55 111 52 67 118 58 73 123 59 74 124 59 74 124 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 60 75 125 61 75 125 -+61 75 125 61 75 125 60 75 125 60 75 125 59 75 125 59 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+59 74 124 60 75 125 60 75 125 59 74 124 59 74 124 58 73 123 -+58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 59 74 124 -+59 74 124 58 73 123 57 72 122 57 72 122 58 73 123 58 73 123 -+58 73 123 57 72 122 58 73 123 58 73 123 48 64 116 28 45 103 -+25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 23 40 99 38 54 110 -+55 69 121 56 70 122 56 70 122 55 69 121 56 70 122 56 70 122 -+56 70 122 56 70 122 55 70 121 56 70 122 55 70 121 54 70 120 -+54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 54 69 120 53 68 119 53 68 119 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 53 68 119 -+54 69 120 47 63 116 25 42 101 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 31 47 105 48 63 117 51 66 119 49 64 117 49 64 117 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 -+50 65 118 49 65 117 48 65 116 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 48 64 116 -+48 64 117 40 57 112 26 43 101 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 30 46 104 45 60 114 -+45 60 114 44 59 113 44 59 113 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 44 60 114 45 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 43 59 113 44 60 114 26 43 102 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 36 52 108 40 56 111 39 55 110 40 56 111 -+39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 -+38 54 110 39 55 111 31 47 105 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 31 47 105 35 51 108 34 50 107 -+35 51 108 35 51 108 34 50 107 35 51 108 34 50 107 33 49 106 -+26 43 101 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+58 73 123 59 74 124 59 74 124 59 74 124 60 75 125 59 74 124 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+59 75 125 59 75 125 60 75 125 60 75 125 60 75 125 61 75 125 -+61 75 125 60 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 62 76 125 61 75 125 50 65 118 39 55 111 -+29 46 104 27 43 102 26 43 101 25 42 101 24 41 100 24 41 100 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 25 42 101 -+26 43 102 27 44 102 34 50 107 44 60 115 57 72 122 62 76 125 -+61 75 125 61 75 125 60 75 125 59 74 124 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+60 75 125 61 75 125 61 75 125 61 75 125 60 75 125 60 75 125 -+59 75 125 59 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 59 74 124 60 75 125 60 75 125 60 75 125 -+59 74 124 59 74 124 58 73 123 58 73 123 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 58 73 123 59 74 124 59 74 124 58 73 123 58 73 123 -+57 72 122 57 72 122 58 73 123 58 73 123 58 73 123 57 72 122 -+58 73 123 57 72 122 55 70 121 36 52 108 23 40 99 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 25 42 101 43 59 113 56 70 122 -+55 69 121 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 55 70 121 56 70 122 55 70 121 54 70 120 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+54 69 120 55 70 121 54 69 120 53 68 119 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+47 62 113 25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+27 44 103 46 61 115 51 66 119 49 64 117 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+49 65 117 48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 48 64 117 49 65 117 48 64 116 48 64 117 -+46 61 115 29 46 104 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 25 42 101 42 57 112 46 61 115 -+45 60 114 44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 44 60 114 45 60 114 44 60 114 43 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 33 49 106 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 30 46 104 39 55 110 39 55 111 40 56 111 40 56 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 38 54 110 -+39 55 111 36 52 108 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 26 43 102 35 51 108 34 50 107 35 51 108 -+35 51 108 34 50 107 35 51 108 34 50 107 34 50 107 31 47 105 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+59 74 124 58 73 123 58 73 123 59 74 124 59 74 124 60 75 125 -+60 75 125 59 74 124 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 59 75 125 59 75 125 59 75 125 60 75 125 -+60 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 59 74 124 61 75 125 61 75 125 62 76 125 -+62 76 125 57 72 122 48 64 117 40 57 112 35 51 108 31 47 105 -+27 44 103 24 41 100 23 40 100 24 41 100 24 41 100 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 24 41 100 23 40 100 -+23 40 100 26 43 101 30 46 104 34 50 106 38 54 110 44 60 114 -+52 67 118 60 75 125 63 77 126 62 76 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 60 75 125 61 75 125 -+61 75 125 60 75 125 60 75 125 60 75 125 59 75 125 59 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 59 74 124 60 75 125 59 74 124 59 74 124 59 74 124 -+58 73 123 58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+58 73 123 59 74 124 58 73 123 58 73 123 57 72 122 57 72 122 -+58 73 123 58 73 123 58 73 123 57 72 122 57 72 122 58 73 123 -+56 71 121 44 61 114 27 44 103 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 29 46 104 46 61 115 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+55 70 121 56 70 122 55 70 121 54 70 120 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 -+55 70 121 54 69 120 53 68 119 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 53 68 119 54 69 120 44 61 114 -+26 43 102 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 26 43 101 -+43 60 114 52 67 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 50 65 118 -+49 65 117 48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 48 64 117 49 65 117 48 64 117 48 64 116 48 63 117 -+34 50 106 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 25 42 101 36 52 108 44 60 115 45 60 114 -+44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 44 60 114 44 60 114 43 60 114 44 60 114 -+43 59 113 44 60 114 39 55 110 24 41 100 24 41 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+25 42 101 36 52 108 40 56 111 39 55 111 40 56 111 39 55 111 -+38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+38 54 111 31 47 105 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 32 50 106 35 51 108 35 51 108 35 51 108 -+35 51 108 35 51 108 34 50 107 34 50 107 33 49 106 25 42 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+59 74 124 59 74 124 59 74 124 58 73 123 58 73 123 59 74 124 -+59 74 124 60 75 125 59 74 124 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 59 75 125 -+59 75 125 60 75 125 60 75 125 61 75 125 61 75 125 61 75 125 -+60 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 59 74 124 -+61 75 125 61 75 125 61 75 125 62 76 125 59 74 124 57 72 122 -+53 67 120 49 64 117 44 59 113 37 53 109 31 47 105 25 42 101 -+23 39 99 23 40 99 23 40 100 24 41 100 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 23 40 100 -+23 40 99 23 40 99 23 40 100 28 45 103 34 50 107 40 56 111 -+47 63 116 51 66 119 55 69 121 58 73 123 62 76 125 62 76 125 -+61 75 125 61 75 125 59 74 124 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 60 75 125 -+60 75 125 60 75 125 59 75 125 59 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 -+60 75 125 60 75 125 59 74 124 59 74 124 58 73 123 58 73 123 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 -+59 74 124 58 73 123 58 73 123 57 72 122 58 73 123 58 73 123 -+58 73 123 58 73 123 57 72 122 58 73 123 59 74 124 49 64 117 -+33 49 106 25 42 101 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 100 -+23 40 99 34 50 107 51 66 119 56 70 122 56 70 122 55 69 121 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 55 70 121 -+56 70 122 55 70 121 54 70 120 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 55 70 121 -+54 69 120 53 68 119 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 53 68 119 54 69 120 44 61 114 27 44 102 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 42 100 42 58 112 -+51 66 119 50 65 118 49 64 117 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 49 65 117 50 65 118 49 65 117 -+48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 48 64 117 48 64 116 50 65 118 36 52 108 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 29 46 104 44 60 114 46 61 115 44 59 113 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 44 60 114 44 60 114 43 60 114 44 60 114 43 59 113 -+44 60 114 42 58 112 28 45 103 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+29 47 104 40 56 111 40 56 111 40 56 111 39 55 111 39 55 111 -+38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+37 53 109 26 43 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 27 44 102 34 50 107 34 50 107 35 51 108 35 51 108 -+35 51 108 35 51 108 34 50 107 34 50 107 30 46 104 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 58 73 123 -+59 74 124 59 74 124 60 75 125 60 75 125 60 75 125 59 74 124 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+59 75 125 59 75 125 59 75 125 60 75 125 60 75 125 60 75 125 -+61 75 125 61 75 125 61 75 125 60 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 60 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 59 74 124 59 74 124 58 73 123 58 73 123 -+55 69 121 47 63 116 40 56 111 34 50 106 26 43 101 23 40 99 -+23 40 100 23 40 100 24 41 100 24 41 100 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 24 41 100 -+24 41 100 23 40 100 23 40 99 24 41 100 29 47 104 37 53 109 -+43 60 114 51 66 119 57 72 122 58 73 123 59 74 124 59 74 124 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 59 74 124 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 60 75 125 61 75 125 -+61 75 125 61 75 125 60 75 125 60 75 125 60 75 125 59 75 125 -+59 75 125 59 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+59 74 124 59 74 124 58 73 123 58 73 123 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 58 73 123 59 74 124 59 74 124 -+58 73 123 58 73 123 57 72 122 58 73 123 58 73 123 58 73 123 -+58 73 123 57 72 122 58 73 123 56 71 121 36 52 108 26 43 101 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+39 55 111 55 69 121 56 70 122 55 69 121 55 69 121 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+55 70 121 54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 -+53 68 119 53 68 119 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 53 68 119 55 70 121 44 60 114 24 41 100 24 41 100 -+24 41 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 40 57 112 50 65 118 -+50 65 118 49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 49 65 117 50 65 118 49 65 117 48 65 116 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 48 64 116 48 64 117 40 56 111 25 42 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 42 58 112 46 61 115 45 60 114 44 59 113 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+44 60 114 45 60 114 43 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 34 50 107 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+38 54 109 40 56 111 39 55 110 40 56 111 39 55 111 38 54 111 -+39 55 111 39 55 111 39 55 111 39 55 111 38 54 110 38 54 110 -+31 47 105 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+25 42 100 31 47 105 35 51 108 35 51 108 35 51 108 35 51 108 -+35 51 108 34 50 107 34 50 107 34 50 106 26 43 101 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 58 73 123 58 73 123 59 74 124 59 74 124 -+60 75 125 60 75 125 59 74 124 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 59 75 125 -+59 75 125 59 75 125 60 75 125 60 75 125 60 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 60 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 59 74 124 -+61 75 125 61 75 125 61 75 125 62 76 125 62 76 125 59 74 124 -+53 68 119 48 63 117 42 57 112 37 53 109 32 48 105 28 45 103 -+27 44 102 27 43 102 26 43 102 26 43 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 24 41 100 24 41 100 -+24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 -+24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 -+24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 26 43 101 26 43 101 -+26 43 102 27 44 102 27 44 102 29 46 104 34 50 107 40 56 111 -+45 60 114 50 65 118 57 72 122 62 76 125 62 76 125 61 75 125 -+61 75 125 61 75 125 61 75 125 59 74 124 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 60 75 125 -+61 75 125 61 75 125 61 75 125 60 75 125 60 75 125 60 75 125 -+59 75 125 59 75 125 59 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 59 74 124 59 74 124 59 74 124 58 73 123 -+58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+58 73 123 59 74 124 58 73 123 58 73 123 58 73 123 57 72 122 -+58 73 123 58 73 123 58 73 123 58 73 123 57 72 122 58 73 123 -+58 73 123 56 71 121 47 63 116 27 44 102 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 101 24 41 100 27 43 102 43 60 114 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 55 70 121 56 70 122 55 70 121 54 70 120 -+54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 54 69 120 55 70 121 54 69 120 53 68 119 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 43 59 113 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 25 42 101 37 53 109 50 65 118 50 65 118 -+49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 49 65 117 50 65 118 49 65 117 48 65 116 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 -+49 65 117 48 64 117 48 64 117 43 60 114 26 43 102 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 36 52 108 46 61 115 45 60 114 44 59 113 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+44 60 114 43 60 114 44 60 114 44 60 114 43 59 113 44 60 114 -+40 56 111 26 43 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 32 48 105 -+40 56 111 39 55 110 40 56 111 39 55 111 38 54 111 39 55 111 -+39 55 111 39 55 111 39 55 111 38 54 110 39 55 111 37 53 109 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+27 43 102 34 50 107 35 51 108 35 51 108 35 51 108 35 51 108 -+35 51 108 34 50 107 34 50 107 30 46 104 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 58 73 123 -+59 74 124 59 74 124 60 75 125 60 75 125 59 74 124 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 59 75 125 59 75 125 59 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 61 75 125 61 75 125 61 75 125 -+60 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 59 74 124 61 75 125 -+61 75 125 61 75 125 62 76 125 62 76 125 63 77 126 62 76 125 -+58 73 123 55 70 121 53 67 120 49 64 117 47 63 116 44 60 114 -+42 58 112 39 55 111 37 53 109 36 52 108 36 52 108 35 52 107 -+34 50 107 33 49 106 33 49 106 33 49 106 32 48 107 32 48 105 -+32 48 105 32 48 105 32 48 105 32 48 107 32 50 106 32 50 106 -+33 49 106 34 50 106 34 50 107 35 52 107 36 52 108 37 53 109 -+39 55 110 40 57 112 43 58 114 46 61 115 48 63 117 50 65 118 -+54 69 120 57 72 122 61 75 125 63 77 126 63 77 126 62 76 125 -+62 76 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+60 75 125 60 75 125 60 75 125 59 75 125 59 75 125 59 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 59 74 124 60 75 125 60 75 125 -+59 74 124 59 74 124 59 74 124 58 73 123 58 73 123 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 59 74 124 -+59 74 124 58 73 123 58 73 123 57 72 122 57 72 122 58 73 123 -+58 73 123 58 73 123 58 73 123 57 72 122 58 73 123 57 72 122 -+48 64 117 34 50 106 23 40 99 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 31 47 105 48 63 117 57 72 122 -+56 70 122 55 69 121 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 55 70 121 56 70 122 55 70 121 54 70 120 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 54 69 120 55 70 121 54 69 120 53 68 119 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 53 68 119 -+54 69 120 42 57 112 25 42 101 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 34 50 107 50 65 118 50 65 118 49 64 117 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 49 65 117 49 65 117 48 65 116 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 49 65 117 -+48 64 117 48 63 117 46 61 115 29 47 104 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 100 24 41 100 -+31 47 105 46 61 115 45 60 114 45 60 114 44 59 113 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 45 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 43 60 114 43 59 113 -+29 47 104 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 27 44 102 40 56 111 -+40 56 111 39 55 111 40 56 111 38 54 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 28 45 103 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+29 47 104 35 51 108 34 50 107 35 51 108 35 51 108 34 50 107 -+35 51 108 33 49 106 33 49 106 27 43 102 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+58 73 123 59 74 124 59 74 124 59 74 124 60 75 125 60 75 125 -+60 75 125 59 74 124 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 59 75 125 -+59 75 125 59 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+61 75 125 61 75 125 61 75 125 60 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 59 74 124 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 62 76 125 -+62 76 125 62 76 125 62 76 125 61 75 125 60 75 125 59 74 124 -+58 73 123 58 73 123 58 73 123 57 72 122 57 72 122 57 72 122 -+57 72 122 57 72 122 57 72 122 57 72 122 57 72 122 58 73 123 -+58 73 123 58 73 123 59 74 124 59 74 124 61 75 125 62 76 125 -+62 76 125 62 76 125 62 76 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 59 74 124 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 60 75 125 61 75 125 -+61 75 125 61 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+59 75 125 59 75 125 59 75 125 59 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 59 74 124 -+59 74 124 58 73 123 58 73 123 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 58 73 123 59 74 124 58 73 123 -+58 73 123 57 72 122 57 72 122 58 73 123 58 73 123 58 73 123 -+58 73 123 57 72 122 58 73 123 59 74 124 50 65 118 35 51 108 -+26 43 101 24 41 100 25 42 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 39 55 110 53 67 120 56 70 122 55 69 121 -+55 69 121 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 55 70 121 54 70 120 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 54 69 120 53 68 119 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 53 67 120 53 68 119 55 70 121 -+40 56 111 25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+23 40 100 33 49 106 50 65 118 51 66 119 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+49 65 117 50 65 118 49 65 117 48 65 116 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 48 64 117 49 65 117 48 64 117 -+47 63 116 48 64 117 34 50 106 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 27 44 103 -+43 58 114 45 60 114 45 60 114 44 59 113 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 44 60 114 45 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 43 59 113 44 60 114 36 52 108 -+24 41 100 24 41 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 25 42 100 36 52 108 40 56 111 -+39 55 110 40 56 111 39 55 111 38 54 111 39 55 111 39 55 111 -+39 55 111 39 55 111 38 54 110 39 55 111 34 50 107 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 26 43 101 -+34 50 108 35 51 108 35 51 108 35 51 108 35 51 108 35 51 108 -+34 50 107 33 49 106 31 47 105 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 58 73 123 58 73 123 58 73 123 59 74 124 59 74 124 -+59 74 124 60 75 125 59 74 124 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 59 75 125 59 75 125 59 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 60 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 59 74 124 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+60 75 125 61 75 125 61 75 125 61 75 125 61 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 59 75 125 59 75 125 59 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 -+60 75 125 60 75 125 59 74 124 59 74 124 59 74 124 58 73 123 -+58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 58 73 123 59 74 124 59 74 124 58 73 123 58 73 123 -+57 72 122 57 72 122 58 73 123 58 73 123 58 73 123 58 73 123 -+58 73 123 58 73 123 55 70 121 36 52 108 25 42 101 24 41 100 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+25 42 101 44 60 115 55 69 121 56 70 122 55 69 121 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 55 70 121 -+55 70 121 55 70 121 55 70 121 54 70 120 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 -+54 69 120 54 69 120 54 69 120 53 68 119 54 69 120 54 69 120 -+54 69 120 54 69 120 53 68 119 54 69 120 55 70 121 37 53 109 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+32 48 105 50 65 118 50 65 118 49 64 117 49 64 117 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 -+50 65 118 49 65 117 48 65 116 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 47 63 116 -+49 65 117 36 52 108 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 37 53 109 -+46 61 115 46 61 115 44 59 113 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 43 60 114 -+43 60 114 44 60 114 43 59 113 44 60 114 40 57 112 25 42 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 29 47 104 39 55 110 39 55 110 -+39 55 111 40 56 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 38 54 110 26 43 102 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 31 47 105 -+35 51 108 34 50 107 35 51 108 35 51 108 34 50 107 35 51 108 -+34 50 107 33 49 106 27 44 102 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+58 73 123 58 73 123 59 74 124 59 74 124 58 73 123 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+58 73 123 58 73 123 59 74 124 59 74 124 59 74 124 60 75 125 -+60 75 125 59 74 124 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 59 75 125 59 75 125 59 75 125 59 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 60 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 59 75 125 59 75 125 59 75 125 59 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+59 74 124 60 75 125 60 75 125 60 75 125 59 74 124 59 74 124 -+59 74 124 58 73 123 58 73 123 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 58 73 123 59 74 124 59 74 124 -+58 73 123 58 73 123 58 73 123 57 72 122 58 73 123 58 73 123 -+58 73 123 58 73 123 57 72 122 58 73 123 58 73 123 57 72 122 -+55 70 121 43 58 114 25 42 101 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 101 24 41 100 25 42 101 30 46 104 -+51 66 119 56 70 122 55 69 121 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 55 70 121 56 70 122 55 70 121 -+54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 54 69 120 55 70 121 54 69 120 -+53 68 119 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 53 68 119 54 69 120 53 68 119 36 52 108 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 30 46 104 -+49 64 117 50 65 118 49 64 117 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 49 65 117 50 65 118 50 65 118 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 48 64 117 49 65 116 48 64 117 48 64 117 -+40 57 112 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 32 48 105 46 61 115 -+46 61 115 44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 44 60 114 45 60 114 44 60 114 43 60 114 -+44 60 114 43 59 113 44 60 114 44 60 113 28 45 103 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 26 43 102 36 52 108 40 56 111 39 55 111 -+40 56 111 39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 32 48 107 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 26 43 101 35 51 108 -+34 50 107 35 51 108 35 51 108 34 50 107 35 51 108 34 50 107 -+34 50 107 32 48 105 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+57 72 122 58 73 123 58 73 123 58 73 123 59 74 124 59 74 124 -+58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 58 73 123 58 73 123 59 74 124 59 74 124 -+59 74 124 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+59 75 125 59 75 125 59 75 125 59 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 60 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 59 75 125 59 75 125 -+59 75 125 59 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 60 75 125 -+60 75 125 59 74 124 59 74 124 59 74 124 58 73 123 58 73 123 -+58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 58 73 123 -+58 73 123 57 72 122 57 72 122 58 73 123 58 73 123 58 73 123 -+58 73 123 57 72 122 58 73 123 58 73 123 54 69 120 44 60 113 -+29 46 103 23 40 99 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 26 43 102 39 55 110 56 71 121 -+56 70 122 55 69 121 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 55 70 121 54 70 120 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 54 69 120 55 70 121 54 69 120 53 68 119 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+53 68 119 54 69 120 51 67 118 35 52 107 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 29 46 104 47 63 116 -+51 66 119 49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 49 65 117 -+48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 48 64 117 49 65 117 48 64 117 48 64 117 43 59 113 -+26 43 102 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 27 44 102 44 60 114 46 61 115 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 44 60 114 45 60 114 44 60 114 43 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 35 51 108 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 100 31 47 105 40 56 111 40 56 111 40 56 111 -+39 55 111 39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 37 53 109 26 43 102 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 32 48 107 35 51 108 -+35 51 108 35 51 108 35 51 108 35 51 108 34 50 107 34 50 107 -+34 50 107 26 43 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+58 73 123 57 72 122 57 72 122 57 72 122 58 73 123 58 73 123 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 58 73 123 -+58 73 123 59 74 124 59 74 124 60 75 125 60 75 125 60 75 125 -+59 74 124 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 59 75 125 59 75 125 -+59 75 125 59 75 125 59 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 60 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 59 75 125 -+59 75 125 59 75 125 59 75 125 59 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 -+59 74 124 59 74 124 58 73 123 58 73 123 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+58 73 123 59 74 124 58 73 123 58 73 123 58 73 123 57 72 122 -+57 72 122 58 73 123 58 73 123 58 73 123 58 73 123 57 72 122 -+58 73 123 59 74 124 55 71 121 40 57 112 29 47 104 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 100 23 40 100 30 46 104 48 63 117 56 70 122 56 70 122 -+55 69 121 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 55 70 121 55 70 121 55 70 121 55 70 121 54 70 120 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 54 69 120 55 70 121 54 69 120 54 69 120 53 68 119 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 53 68 119 -+54 69 120 51 66 119 32 48 105 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 27 44 102 46 61 115 51 66 119 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 49 65 117 49 65 117 48 65 116 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+48 64 117 49 65 117 48 64 117 48 63 117 46 61 115 28 45 103 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 25 42 101 40 57 112 46 61 115 45 60 114 -+44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 44 60 114 43 60 114 44 60 114 44 60 114 -+44 60 114 43 60 114 40 57 112 26 43 101 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 26 43 102 39 55 110 40 56 111 39 55 110 39 55 111 -+39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 -+38 54 110 38 54 110 31 47 105 24 41 100 25 42 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 27 44 103 34 50 107 34 50 107 -+35 51 108 35 51 108 35 51 108 35 51 108 34 50 107 34 50 107 -+29 47 104 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+58 73 123 58 73 123 58 73 123 58 73 123 57 72 122 58 73 123 -+58 73 123 58 73 123 59 74 124 59 74 124 58 73 123 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+58 73 123 58 73 123 58 73 123 59 74 124 59 74 124 59 74 124 -+60 75 125 60 75 125 60 75 125 59 74 124 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 59 75 125 59 75 125 59 75 125 -+59 75 125 59 75 125 59 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 61 75 125 -+61 75 125 61 75 125 61 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 59 75 125 -+59 75 125 59 75 125 59 75 125 59 75 125 59 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 60 75 125 -+60 75 125 60 75 125 59 74 124 59 74 124 59 74 124 58 73 123 -+58 73 123 58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 58 73 123 58 73 123 57 72 122 57 72 122 58 73 123 -+58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 -+57 72 122 40 57 112 27 44 102 25 42 101 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+23 40 100 38 54 110 55 69 121 56 70 122 56 70 122 55 69 121 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+55 70 121 56 70 122 55 70 121 54 70 120 54 70 120 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+54 69 120 55 70 121 54 69 120 54 69 120 53 68 119 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 53 68 119 54 69 120 -+49 64 117 27 44 103 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 26 43 102 47 63 116 51 66 119 49 64 117 -+49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 49 65 117 50 65 118 48 65 116 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 -+49 65 117 48 64 117 47 63 116 48 64 117 31 47 105 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 38 54 110 46 61 115 45 60 114 44 59 113 -+44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+44 60 114 45 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+43 59 113 44 60 114 29 46 104 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 35 51 108 40 56 111 39 55 110 39 55 111 40 56 111 -+38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 37 53 109 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 25 42 101 31 47 105 35 51 108 35 51 108 -+35 51 108 35 51 108 35 51 108 34 50 107 34 50 107 34 50 106 -+26 43 101 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+58 73 123 57 72 122 57 72 122 58 73 123 58 73 123 58 73 123 -+58 73 123 57 72 122 57 72 122 58 73 123 58 73 123 58 73 123 -+59 74 124 59 74 124 58 73 123 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 -+58 73 123 58 73 123 59 74 124 59 74 124 59 74 124 60 75 125 -+60 75 125 60 75 125 60 75 125 59 74 124 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 59 75 125 -+59 75 125 59 75 125 59 75 125 59 75 125 59 75 125 59 75 125 -+59 75 125 59 75 125 59 75 125 59 75 125 59 75 125 59 75 125 -+59 75 125 59 75 125 59 75 125 59 75 125 59 75 125 59 75 125 -+59 75 125 59 75 125 59 75 125 59 75 125 59 75 125 59 75 125 -+59 75 125 59 75 125 59 75 125 59 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 -+60 75 125 60 75 125 60 75 125 59 74 124 59 74 124 59 74 124 -+58 73 123 58 73 123 58 73 123 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 58 73 123 58 73 123 57 72 122 -+57 72 122 57 72 122 58 73 123 58 73 123 58 73 123 58 73 123 -+57 72 122 58 73 123 58 73 123 57 72 122 55 70 121 43 59 113 -+26 43 102 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 27 44 103 -+47 63 116 56 70 122 55 69 121 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 55 70 121 -+55 70 121 54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 55 70 121 -+55 70 121 53 68 119 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 53 68 119 54 69 120 54 69 120 46 61 115 -+26 43 102 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 27 43 102 46 61 115 51 66 119 50 65 118 49 64 117 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+49 65 117 50 65 118 50 65 118 48 65 116 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+48 64 116 48 63 117 48 64 117 33 49 106 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 32 48 107 45 60 114 45 60 114 44 59 113 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 44 60 114 43 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 35 52 107 23 40 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+29 46 104 40 56 111 39 55 110 39 55 111 40 56 111 38 54 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 27 44 103 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 27 44 102 34 50 107 35 51 108 35 51 108 -+35 51 108 35 51 108 35 51 108 34 50 107 34 50 107 30 46 104 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+54 69 120 59 74 124 58 73 123 58 73 123 58 73 123 58 73 123 -+58 73 123 58 73 123 58 73 123 57 72 122 57 72 122 58 73 123 -+58 73 123 58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 58 73 123 58 73 123 58 73 123 59 74 124 -+59 74 124 59 74 124 59 74 124 60 75 125 60 75 125 60 75 125 -+59 74 124 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+59 74 124 59 74 124 59 74 124 58 73 123 58 73 123 58 73 123 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 59 74 124 -+58 73 123 58 73 123 58 73 123 57 72 122 57 72 122 58 73 123 -+58 73 123 58 73 123 58 73 123 58 73 123 57 72 122 58 73 123 -+58 73 123 58 73 123 51 67 118 40 57 112 28 45 103 23 40 99 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 25 42 101 36 52 108 53 67 120 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 55 70 121 55 70 121 55 70 121 -+54 70 120 54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 54 69 120 55 70 121 54 69 120 -+54 69 120 53 68 119 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 53 68 119 54 69 120 54 69 120 44 59 113 26 43 102 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+27 44 102 44 60 114 51 66 119 50 65 118 49 64 117 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 -+50 65 118 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 49 65 116 -+48 64 117 48 63 117 36 52 108 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+27 44 102 42 58 112 46 61 115 45 60 114 44 59 113 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+44 60 114 43 60 114 44 60 114 44 60 114 43 59 113 44 60 114 -+39 55 111 24 41 100 25 42 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 26 43 101 -+38 54 109 39 55 111 39 55 111 40 56 111 39 55 111 38 54 111 -+39 55 111 39 55 111 39 55 111 39 55 111 38 54 110 39 55 111 -+33 49 106 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 31 47 105 35 51 108 34 50 107 35 51 108 -+35 51 108 34 50 107 35 51 108 33 49 106 33 49 106 26 43 102 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+31 47 105 40 57 112 55 70 121 59 74 124 58 73 123 57 72 122 -+58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 57 72 122 -+57 72 122 58 73 123 58 73 123 59 74 124 59 74 124 59 74 124 -+58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 -+58 73 123 58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 -+60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 59 74 124 59 74 124 59 74 124 59 74 124 -+58 73 123 58 73 123 58 73 123 58 73 123 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 -+58 73 123 57 72 122 57 72 122 57 72 122 58 73 123 58 73 123 -+58 73 123 58 73 123 57 72 122 58 73 123 58 73 123 59 74 124 -+48 63 117 36 52 108 28 45 103 23 40 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 23 40 100 31 47 105 47 63 116 55 69 121 56 70 122 -+55 69 121 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 55 70 121 56 70 122 56 70 122 55 70 121 54 70 120 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 54 69 120 55 70 121 54 69 120 54 69 120 -+53 68 119 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+53 68 119 54 69 120 55 69 121 38 54 110 25 42 101 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 25 42 102 -+44 60 114 51 66 119 50 65 118 49 64 117 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+49 65 117 49 65 117 48 65 116 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 48 64 117 49 65 117 48 64 117 -+48 64 117 38 56 110 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 100 24 41 101 -+40 56 111 46 61 115 45 60 114 44 59 113 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 45 60 114 -+44 60 114 43 60 114 44 60 114 43 59 113 44 60 114 42 58 112 -+27 44 103 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 42 100 33 49 106 -+39 55 110 39 55 110 40 56 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 38 54 110 39 55 111 37 53 109 -+26 43 102 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 27 44 103 35 51 108 35 51 108 35 51 108 35 51 108 -+35 51 108 35 51 108 34 50 107 33 49 106 31 47 105 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 25 42 101 26 43 102 37 53 109 54 69 120 59 74 124 -+58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 -+58 73 123 57 72 122 57 72 122 58 73 123 58 73 123 58 73 123 -+59 74 124 59 74 124 58 73 123 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 58 73 123 58 73 123 58 73 123 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 60 75 125 60 75 125 -+60 75 125 60 75 125 59 74 124 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 58 73 123 58 73 123 58 73 123 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 -+59 74 124 59 74 124 58 73 123 58 73 123 58 73 123 57 72 122 -+57 72 122 58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 -+58 73 123 57 72 122 58 73 123 58 73 123 46 61 115 30 46 104 -+26 43 101 24 41 100 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+25 42 100 39 55 110 54 69 120 56 70 122 56 70 122 55 69 121 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+55 70 121 56 70 122 55 70 121 55 70 121 54 70 120 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 54 69 120 55 70 121 54 69 120 53 68 119 53 68 119 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 53 68 119 34 50 107 25 42 101 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 42 100 46 61 115 -+51 66 119 50 65 118 49 64 117 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 50 65 118 -+48 65 116 48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 48 64 117 49 65 117 48 64 116 48 64 117 -+42 58 112 25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 23 40 100 37 53 109 -+46 61 115 45 60 114 44 59 113 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 44 60 114 45 60 114 44 60 114 -+43 60 114 44 60 114 44 60 114 44 60 114 43 59 113 34 50 106 -+25 42 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 27 44 102 38 54 110 -+40 56 111 39 55 111 40 56 111 39 55 111 38 54 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 31 47 105 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 33 49 106 35 51 108 34 50 107 35 51 108 35 51 108 -+34 50 107 35 51 108 34 50 107 33 49 106 26 43 102 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 100 24 41 100 24 41 100 34 50 107 -+51 66 119 56 71 121 57 72 122 58 73 123 58 73 123 58 73 123 -+58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 57 72 122 -+57 72 122 57 72 122 58 73 123 58 73 123 58 73 123 59 74 124 -+59 74 124 58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 58 73 123 58 73 123 58 73 123 -+58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 59 74 124 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 58 73 123 58 73 123 58 73 123 58 73 123 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+58 73 123 59 74 124 59 74 124 59 74 124 58 73 123 58 73 123 -+58 73 123 57 72 122 57 72 122 58 73 123 58 73 123 58 73 123 -+58 73 123 58 73 123 58 73 123 57 72 122 58 73 123 58 73 123 -+57 72 122 55 71 121 44 60 113 28 45 103 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 25 42 101 29 46 104 -+48 64 117 57 72 122 56 70 122 55 69 121 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 55 70 121 56 70 122 -+55 70 121 55 70 121 54 70 120 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 -+55 70 121 55 70 121 54 69 120 53 68 119 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 53 68 119 54 69 120 54 69 120 -+50 65 118 32 50 106 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 26 43 102 44 60 115 51 66 119 -+50 65 118 49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 49 65 117 50 65 118 50 65 118 48 65 116 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 48 64 116 48 64 117 44 61 114 -+25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 32 48 105 46 61 115 -+45 60 114 45 60 114 44 59 113 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 44 60 114 45 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 43 59 113 44 60 114 38 54 110 25 42 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 25 42 101 35 51 108 40 56 111 -+39 55 110 39 55 111 39 55 111 38 54 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 36 52 108 26 43 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 101 24 41 100 -+29 45 103 35 51 108 34 50 107 35 51 108 35 51 108 34 50 107 -+35 51 108 34 50 107 34 50 107 31 47 105 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+23 40 100 32 48 105 43 60 114 51 66 119 57 72 122 58 73 123 -+58 73 123 57 72 122 58 73 123 58 73 123 58 73 123 58 73 123 -+58 73 123 58 73 123 57 72 122 57 72 122 58 73 123 58 73 123 -+58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 59 74 124 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 58 73 123 58 73 123 58 73 123 -+58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 59 74 124 -+59 74 124 58 73 123 58 73 123 58 73 123 57 72 122 57 72 122 -+57 72 122 58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 -+57 72 122 58 73 123 58 73 123 59 74 124 55 70 121 48 64 116 -+38 54 110 26 43 101 23 40 99 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 28 45 103 40 56 111 56 71 121 -+56 70 122 55 69 121 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 55 70 121 56 70 122 56 70 122 55 70 121 -+54 70 120 54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 55 70 121 -+54 69 120 54 69 120 53 68 119 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 53 68 119 54 69 120 54 69 120 47 63 116 -+29 46 104 23 40 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 27 44 102 43 60 114 51 66 119 50 65 118 -+49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 49 65 117 50 65 118 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+48 64 117 49 65 117 48 64 116 48 64 117 44 60 114 26 43 102 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 28 45 103 44 60 114 46 61 115 -+45 60 114 44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 44 60 114 45 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 43 59 113 44 60 114 42 58 112 27 43 102 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 29 47 104 40 57 112 39 55 110 -+39 55 111 40 56 111 38 54 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 38 54 110 39 55 111 29 46 104 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 -+33 49 106 35 52 107 35 51 108 35 51 108 35 51 108 35 51 108 -+34 50 107 34 50 107 33 49 106 25 42 101 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 23 40 100 28 45 103 35 51 108 46 61 115 -+56 71 121 59 74 124 58 73 123 58 73 123 58 73 123 58 73 123 -+58 73 123 58 73 123 58 73 123 58 73 123 57 72 122 57 72 122 -+57 72 122 58 73 123 58 73 123 59 74 124 59 74 124 59 74 124 -+59 74 124 58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 59 74 124 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 59 74 124 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 58 73 123 58 73 123 58 73 123 -+58 73 123 58 73 123 58 73 123 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 -+58 73 123 58 73 123 57 72 122 57 72 122 58 73 123 58 73 123 -+58 73 123 58 73 123 58 73 123 58 73 123 57 72 122 58 73 123 -+58 73 123 59 74 124 51 66 119 40 56 111 32 48 105 25 42 101 -+23 40 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 37 53 109 50 65 118 56 70 122 56 70 122 -+55 69 121 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 55 70 121 55 70 121 54 70 120 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 54 69 120 55 70 121 54 69 120 -+53 68 119 53 68 119 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 40 56 111 26 43 102 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 26 43 101 44 60 114 51 66 119 50 65 118 49 64 117 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 49 65 117 49 65 117 48 65 116 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 -+49 65 117 48 64 116 48 64 117 44 60 115 29 46 103 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 26 43 101 40 56 111 46 61 115 45 60 114 -+44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 44 60 114 44 60 114 43 60 114 44 60 114 -+44 60 114 44 60 113 44 60 114 30 46 104 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 26 43 102 39 55 110 40 56 111 39 55 111 -+40 56 111 39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 -+39 55 111 38 54 110 39 55 111 34 50 107 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 30 46 104 -+34 50 107 34 50 108 35 51 108 35 51 108 35 51 108 35 51 108 -+34 50 107 34 50 107 29 46 103 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 24 41 100 25 42 101 -+27 44 102 37 53 109 53 68 119 58 73 123 58 73 123 57 72 122 -+57 72 122 58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 -+57 72 122 57 72 122 57 72 122 58 73 123 58 73 123 58 73 123 -+58 73 123 59 74 124 59 74 124 58 73 123 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 -+58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 60 75 125 -+60 75 125 60 75 125 60 75 125 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 58 73 123 58 73 123 58 73 123 -+58 73 123 58 73 123 58 73 123 58 73 123 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 59 74 124 -+59 74 124 59 74 124 58 73 123 58 73 123 58 73 123 57 72 122 -+57 72 122 57 72 122 58 73 123 58 73 123 58 73 123 58 73 123 -+58 73 123 58 73 123 57 72 122 58 73 123 58 73 123 58 73 123 -+46 61 115 31 47 105 26 43 101 25 42 101 24 41 100 24 41 100 -+25 42 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 23 40 100 -+31 47 105 50 65 118 55 69 121 56 70 122 56 70 122 55 69 121 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+55 70 121 56 70 122 55 70 121 54 70 120 54 70 120 54 70 120 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 53 68 119 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+53 67 120 54 69 120 53 68 119 36 52 108 25 42 101 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+26 43 102 47 63 116 51 66 119 50 65 118 49 64 117 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+49 65 117 50 65 118 48 65 116 48 65 116 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 49 65 117 -+48 64 117 48 63 117 47 63 116 31 47 105 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 37 53 109 46 61 115 45 60 114 44 59 113 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 44 60 114 43 60 114 44 60 114 44 60 114 -+43 59 113 44 61 114 34 50 106 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 36 52 108 40 56 111 39 55 110 39 55 111 -+40 56 111 38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 38 54 111 25 42 101 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 26 43 101 33 49 106 -+35 51 108 35 51 108 35 51 108 35 51 108 35 51 108 34 50 107 -+34 50 107 32 48 107 25 42 101 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 23 40 99 31 47 105 46 61 115 55 70 121 -+57 72 122 58 73 123 58 73 123 58 73 123 57 72 122 57 72 122 -+58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 -+57 72 122 57 72 122 58 73 123 58 73 123 58 73 123 58 73 123 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 58 73 123 -+58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 -+58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 -+58 73 123 58 73 123 58 73 123 58 73 123 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 59 74 124 -+59 74 124 59 74 124 58 73 123 58 73 123 58 73 123 58 73 123 -+57 72 122 57 72 122 57 72 122 58 73 123 58 73 123 58 73 123 -+58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 -+58 73 123 57 72 122 56 71 121 52 67 118 39 55 110 25 42 101 -+23 40 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 25 42 101 27 44 102 42 57 112 -+56 70 122 56 70 122 55 69 121 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 54 70 120 54 70 120 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 -+55 70 121 55 70 121 54 69 120 53 68 119 53 68 119 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 53 68 119 54 69 120 -+54 69 120 51 66 119 32 48 105 23 40 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 27 44 103 -+46 61 115 51 66 119 50 65 118 49 64 117 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 50 65 118 -+50 65 118 48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 48 64 116 -+48 64 117 47 63 116 33 49 106 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 32 48 107 47 63 116 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 -+45 60 114 44 60 114 43 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 38 54 110 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 31 47 105 39 55 110 39 55 110 40 56 111 40 56 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 38 54 110 -+39 55 111 39 55 111 29 46 104 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 29 46 104 35 51 108 -+34 50 107 35 51 108 35 51 108 34 50 107 35 51 108 34 50 107 -+34 50 107 28 45 103 24 41 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 101 24 41 100 23 40 99 25 42 101 -+36 52 108 46 61 115 51 67 118 57 72 122 59 74 124 58 73 123 -+58 73 123 57 72 122 58 73 123 58 73 123 58 73 123 58 73 123 -+58 73 123 58 73 123 57 72 122 57 72 122 57 72 122 57 72 122 -+58 73 123 58 73 123 58 73 123 59 74 124 59 74 124 59 74 124 -+59 74 124 58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 58 73 123 59 74 124 59 74 124 59 74 124 58 73 123 -+58 73 123 58 73 123 58 73 123 57 72 122 57 72 122 57 72 122 -+58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 -+57 72 122 57 72 122 58 73 123 58 73 123 58 73 123 54 69 120 -+49 65 117 40 57 112 31 47 105 23 40 100 23 40 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 23 40 100 27 44 103 37 53 109 51 66 119 57 72 122 -+56 70 122 55 69 121 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 55 70 121 55 70 121 55 70 121 -+55 70 121 54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 55 70 121 -+54 69 120 54 69 120 53 68 119 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+44 61 114 27 44 102 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 29 45 103 46 61 115 -+51 66 119 50 65 118 49 64 117 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 49 65 117 50 65 118 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 48 64 116 48 64 117 -+47 63 116 34 50 107 23 40 99 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+30 46 104 46 61 115 45 60 114 45 60 114 44 59 113 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 45 60 114 -+44 60 114 43 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+42 58 112 28 45 103 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+26 43 102 37 53 109 40 56 111 39 55 111 40 56 111 39 55 111 -+38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 38 54 111 -+39 55 111 34 50 108 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 25 42 101 34 50 107 35 51 108 -+35 51 108 35 51 108 35 51 108 35 51 108 34 50 107 33 49 106 -+32 48 107 26 43 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+24 41 100 24 41 100 28 45 103 34 50 106 42 58 112 51 67 118 -+59 74 124 59 74 124 58 73 123 58 73 123 58 73 123 58 73 123 -+58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 -+57 72 122 57 72 122 57 72 122 58 73 123 58 73 123 58 73 123 -+58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 58 73 123 59 74 124 59 74 124 -+59 74 124 59 74 124 58 73 123 58 73 123 58 73 123 57 72 122 -+57 72 122 57 72 122 57 72 122 58 73 123 58 73 123 58 73 123 -+58 73 123 58 73 123 58 73 123 58 73 123 57 72 122 58 73 123 -+58 73 123 59 74 124 55 71 121 47 63 116 37 53 109 31 47 105 -+26 43 101 23 40 100 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 37 53 109 48 63 117 56 70 122 56 70 122 55 69 121 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 55 70 121 56 70 122 56 70 122 55 70 121 54 70 120 -+54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 -+54 69 120 53 68 119 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 53 68 119 54 69 120 54 69 120 38 54 109 -+25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 23 40 100 29 46 104 47 63 116 51 66 119 -+50 65 118 49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 49 65 117 -+48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 48 64 117 49 65 116 48 64 117 47 63 116 -+34 50 107 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 28 45 103 -+43 58 114 46 61 115 45 60 114 44 59 113 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 43 59 113 44 60 114 -+32 48 105 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+33 49 106 40 56 111 39 55 111 40 56 111 39 55 111 39 55 111 -+38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+38 54 110 28 45 103 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 31 47 105 35 51 108 34 50 107 -+35 51 108 35 51 108 34 50 107 35 51 108 34 50 107 33 49 106 -+28 45 103 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 24 41 100 25 42 101 26 43 102 -+29 46 104 39 55 111 52 67 118 59 74 124 58 73 123 58 73 123 -+57 72 122 57 72 122 58 73 123 58 73 123 58 73 123 58 73 123 -+58 73 123 58 73 123 58 73 123 57 72 122 57 72 122 57 72 122 -+58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 59 74 124 -+59 74 124 59 74 124 59 74 124 58 73 123 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 -+59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 58 73 123 -+58 73 123 58 73 123 57 72 122 57 72 122 57 72 122 57 72 122 -+58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 -+58 73 123 58 73 123 58 73 123 58 73 123 59 74 124 57 72 122 -+47 63 116 34 50 107 27 44 102 26 43 101 24 41 100 24 41 100 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 23 40 99 31 47 105 -+49 64 117 55 69 121 56 70 122 56 70 122 55 69 121 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 55 70 121 55 70 121 54 70 120 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 54 69 120 55 70 121 54 69 120 53 68 119 -+53 68 119 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 53 68 119 54 69 120 52 67 118 32 48 105 24 41 100 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 31 47 105 49 64 117 51 66 119 49 64 117 -+49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 49 65 117 50 65 118 48 65 116 48 65 116 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 48 64 117 49 65 117 48 64 117 47 63 116 35 51 108 -+25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 26 43 101 39 55 110 -+46 61 115 46 61 115 44 59 113 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 44 60 114 45 60 114 44 60 114 -+43 60 114 44 60 114 44 60 114 43 59 113 44 60 114 36 52 108 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 28 45 103 -+40 56 111 40 56 111 39 55 110 39 55 111 38 54 111 38 54 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 38 54 110 -+33 49 106 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 27 44 102 35 51 108 35 51 108 35 51 108 -+35 51 108 35 51 108 35 51 108 34 50 107 34 50 107 32 48 105 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 23 40 99 27 44 103 39 55 110 50 65 118 -+55 70 121 56 71 121 57 72 122 58 73 123 58 73 123 58 73 123 -+57 72 122 58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 -+58 73 123 58 73 123 58 73 123 58 73 123 57 72 122 57 72 122 -+57 72 122 57 72 122 58 73 123 58 73 123 58 73 123 58 73 123 -+58 73 123 58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 58 73 123 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 -+57 72 122 57 72 122 57 72 122 57 72 122 58 73 123 58 73 123 -+58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 -+58 73 123 57 72 122 58 73 123 58 73 123 58 73 123 58 73 123 -+57 72 122 56 71 121 54 69 120 45 60 114 33 49 106 24 41 100 -+23 40 100 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 25 42 101 29 46 104 46 61 115 56 70 122 -+56 70 122 55 69 121 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 55 70 121 56 70 122 56 70 122 -+55 70 121 54 70 120 54 70 120 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 53 68 119 53 68 119 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 53 68 119 -+54 69 120 54 69 120 47 63 116 25 42 102 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 32 48 107 49 64 117 50 65 118 49 64 117 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+49 65 117 50 65 118 50 65 118 48 65 116 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 -+49 65 117 49 65 116 48 64 117 47 63 116 38 54 110 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 25 42 101 36 52 108 47 63 116 -+45 60 114 44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 44 60 114 45 60 114 44 60 114 43 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 39 55 111 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 38 54 110 -+40 56 111 39 55 111 40 56 111 39 55 111 38 54 111 39 55 111 -+39 55 111 39 55 111 39 55 111 38 54 110 39 55 111 38 54 110 -+25 42 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 25 42 101 33 49 106 35 52 107 35 51 108 35 51 108 -+35 51 108 35 51 108 35 51 108 34 50 107 34 50 107 27 44 102 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 23 40 100 23 40 99 -+27 43 102 36 52 108 43 59 113 49 64 117 53 67 120 57 72 122 -+59 74 124 58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 -+58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 -+58 73 123 58 73 123 57 72 122 57 72 122 57 72 122 57 72 122 -+57 72 122 57 72 122 58 73 123 58 73 123 58 73 123 58 73 123 -+58 73 123 58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 -+58 73 123 57 72 122 57 72 122 57 72 122 57 72 122 57 72 122 -+58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 -+58 73 123 58 73 123 58 73 123 58 73 123 57 72 122 58 73 123 -+58 73 123 58 73 123 58 73 123 55 70 121 51 66 119 46 61 115 -+38 56 110 31 47 105 24 41 100 23 40 99 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+24 41 100 31 47 105 42 57 112 55 69 121 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 55 70 121 55 70 121 -+54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 -+54 69 120 54 69 120 54 69 120 53 68 119 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 53 68 119 54 69 120 -+52 67 118 39 55 110 24 41 101 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+34 50 107 49 64 117 51 66 119 49 64 117 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 -+50 65 118 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+48 64 116 48 64 117 48 64 117 38 54 110 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 33 49 106 47 63 116 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 44 60 114 43 60 114 44 60 114 -+44 60 114 43 59 113 44 60 114 42 58 112 27 44 102 24 41 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 34 50 107 40 56 111 -+39 55 110 40 56 111 39 55 111 38 54 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 38 54 111 28 45 103 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 29 46 104 34 50 107 34 50 108 35 51 108 35 51 108 -+35 51 108 35 51 108 34 50 107 34 50 107 31 47 105 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 100 -+24 41 100 24 41 100 23 40 100 25 42 101 30 46 104 34 50 107 -+39 55 110 47 63 116 54 69 120 59 74 124 59 74 124 58 73 123 -+58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 -+58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 -+58 73 123 58 73 123 57 72 122 57 72 122 57 72 122 57 72 122 -+57 72 122 58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 -+58 73 123 58 73 123 58 73 123 58 73 123 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 59 74 124 59 74 124 58 73 123 58 73 123 -+58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 -+58 73 123 57 72 122 57 72 122 57 72 122 57 72 122 57 72 122 -+57 72 122 57 72 122 58 73 123 58 73 123 58 73 123 58 73 123 -+58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 -+57 72 122 58 73 123 58 73 123 59 74 124 60 75 125 57 72 122 -+50 65 118 43 59 113 36 52 108 32 50 106 28 45 103 24 41 100 -+23 40 100 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 23 40 100 31 47 105 -+44 60 114 53 67 120 57 72 122 56 70 122 55 69 121 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 55 70 121 55 70 121 55 70 121 55 70 121 54 70 120 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 54 69 120 55 70 121 55 70 121 -+54 69 120 53 68 119 53 68 119 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 53 68 119 53 68 119 55 70 121 48 63 117 -+31 47 105 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 23 40 99 38 54 110 -+50 65 118 51 66 119 50 65 118 49 64 117 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+49 65 117 49 65 117 48 65 116 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 49 65 116 -+48 64 117 48 64 117 37 53 109 24 41 101 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 23 40 100 32 48 105 45 60 114 45 60 114 45 60 114 -+44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 44 60 114 45 60 114 43 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 43 59 113 31 47 105 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 100 24 41 100 30 46 104 39 55 110 39 55 110 -+39 55 111 40 56 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 38 54 110 39 55 111 32 50 106 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+25 42 101 33 49 106 35 51 108 35 51 108 35 51 108 35 51 108 -+35 51 108 34 50 107 34 50 107 33 49 106 26 43 101 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 24 41 100 24 41 100 -+25 42 101 26 43 101 26 43 102 29 46 103 37 53 109 46 61 115 -+54 70 120 59 74 124 58 73 123 58 73 123 58 73 123 58 73 123 -+58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 -+58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 -+58 73 123 57 72 122 57 72 122 57 72 122 57 72 122 57 72 122 -+57 72 122 57 72 122 57 72 122 58 73 123 58 73 123 58 73 123 -+58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 -+58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 -+58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 -+58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 -+58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 57 72 122 -+57 72 122 57 72 122 57 72 122 57 72 122 57 72 122 57 72 122 -+57 72 122 58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 -+58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 -+58 73 123 58 73 123 57 72 122 58 73 123 58 73 123 58 73 123 -+59 74 124 58 73 123 50 65 118 42 58 112 32 50 106 27 44 102 -+26 43 102 25 42 101 24 41 100 24 41 100 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 23 40 100 27 44 103 44 60 115 55 69 121 -+55 69 121 56 70 122 55 69 121 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 55 70 121 -+56 70 122 56 70 122 55 70 121 54 70 120 54 70 120 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 54 69 120 -+53 68 119 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 40 57 112 26 43 102 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 40 56 111 50 65 118 -+50 65 118 49 64 117 49 64 117 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 50 65 118 -+48 65 116 48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 48 64 117 49 65 117 48 64 117 -+48 64 117 37 53 109 25 42 101 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 29 46 104 44 59 113 46 61 115 44 59 113 44 59 113 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+44 60 114 45 60 114 44 60 114 43 60 114 44 60 114 44 60 114 -+43 59 113 44 60 114 36 52 108 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 26 43 102 37 53 109 40 56 111 39 55 111 -+40 56 111 39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 -+39 55 111 38 54 110 39 55 111 36 52 108 26 43 101 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+29 46 104 35 51 108 35 51 108 35 51 108 35 51 108 35 51 108 -+34 50 107 34 50 107 34 50 107 29 46 104 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 24 41 100 -+23 40 99 26 43 102 34 50 108 42 58 112 51 67 118 55 70 121 -+56 71 121 56 71 121 57 72 122 58 73 123 58 73 123 58 73 123 -+58 73 123 58 73 123 58 73 123 57 72 122 58 73 123 58 73 123 -+58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 -+58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 -+58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 -+58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 -+58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 -+58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 -+58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 -+58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 -+58 73 123 58 73 123 58 73 123 58 73 123 57 72 122 58 73 123 -+58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 57 72 122 -+57 72 122 56 71 121 55 71 121 54 69 120 47 63 116 39 55 110 -+31 47 105 24 41 100 23 40 100 24 41 100 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+25 42 101 29 45 103 43 58 114 56 70 122 56 70 122 55 69 121 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 55 70 121 56 70 122 55 70 121 55 70 121 -+55 70 121 54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 -+55 70 121 55 70 121 54 69 120 53 68 119 53 68 119 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 53 68 119 -+54 69 120 54 69 120 51 66 119 35 52 107 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 26 43 102 40 57 112 51 66 119 50 65 118 -+49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 49 65 117 50 65 118 50 65 118 48 65 116 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 48 64 117 49 65 117 49 65 116 48 64 117 47 63 116 -+39 55 111 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+27 44 102 40 57 112 46 61 115 45 60 114 44 59 113 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 44 60 114 43 60 114 44 60 114 44 60 114 44 60 113 -+44 60 114 39 55 111 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 25 42 101 33 49 106 40 56 111 39 55 110 40 56 111 -+39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 38 54 110 30 46 104 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 -+34 50 107 35 51 108 35 51 108 35 51 108 35 51 108 35 51 108 -+34 50 107 33 49 106 32 48 107 26 43 101 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 23 40 100 23 39 99 24 41 101 -+30 46 104 36 52 108 40 56 111 44 61 114 48 64 116 51 66 119 -+54 69 120 56 71 121 58 73 123 59 74 124 59 74 124 58 73 123 -+58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 -+58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 -+58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 -+58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 -+58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 -+58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 -+58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 -+58 73 123 58 73 123 58 73 123 58 73 123 57 72 122 58 73 123 -+58 73 123 58 73 123 58 73 123 58 73 123 59 74 124 59 74 124 -+57 72 122 54 70 120 52 67 118 50 65 118 47 63 116 43 59 113 -+38 54 109 33 49 106 27 44 103 23 39 99 23 40 99 23 40 100 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 23 40 100 26 43 101 32 50 106 -+42 58 112 55 69 121 57 72 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+55 70 121 56 70 122 56 70 122 55 70 121 55 70 121 54 70 120 -+54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 55 70 121 -+54 69 120 54 69 120 53 68 119 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 53 67 120 54 69 120 -+53 68 119 45 60 114 29 45 103 23 40 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 28 45 103 42 58 112 52 67 118 50 65 118 49 64 117 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 48 64 116 48 64 117 48 64 117 38 56 110 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 -+38 54 110 47 63 116 45 60 114 44 59 113 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 -+44 60 114 43 60 114 44 60 114 44 60 114 43 59 113 44 60 114 -+40 57 112 25 42 102 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 29 46 104 40 56 111 39 55 111 39 55 111 40 56 111 -+39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 -+38 54 110 39 55 111 34 50 107 25 42 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 32 48 105 -+35 51 108 34 50 107 35 51 108 35 51 108 34 50 107 35 51 108 -+34 50 107 33 49 106 29 46 104 24 41 100 24 41 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 24 41 100 23 40 100 23 40 100 25 42 101 27 44 103 -+29 47 104 33 49 106 35 51 108 38 54 110 42 58 112 46 61 115 -+49 65 117 53 67 120 57 72 122 60 75 125 60 75 125 59 74 124 -+59 74 124 59 74 124 58 73 123 58 73 123 58 73 123 58 73 123 -+58 73 123 58 73 123 57 72 122 58 73 123 58 73 123 58 73 123 -+58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 -+58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 -+58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 -+57 72 122 58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 -+59 74 124 59 74 124 59 74 124 59 74 124 60 75 125 58 73 123 -+55 70 121 51 67 118 48 63 117 44 60 113 40 56 111 36 52 108 -+34 50 107 31 47 105 29 46 104 26 43 102 24 41 100 23 40 100 -+24 41 100 24 41 100 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 23 40 100 24 41 101 36 52 108 47 63 116 54 69 120 -+56 70 122 56 70 122 55 69 121 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 55 70 121 -+56 70 122 55 70 121 55 70 121 54 70 120 54 70 120 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 54 69 120 55 70 121 54 69 120 -+54 69 120 53 68 119 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 53 68 119 54 69 120 50 65 118 -+35 51 108 25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 101 23 40 100 -+31 47 105 46 61 115 51 66 119 50 65 118 50 65 118 49 64 117 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 49 65 117 49 65 117 48 65 116 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+48 64 117 49 65 116 48 64 117 48 64 117 37 53 109 25 42 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 38 54 109 -+46 61 115 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 45 60 114 -+43 60 114 44 60 114 44 60 114 43 59 113 44 60 114 42 58 112 -+28 45 103 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+27 43 102 38 56 110 40 56 111 39 55 110 40 56 111 39 55 111 -+38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 38 54 110 26 43 101 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 28 45 103 35 51 108 -+34 50 107 35 51 108 35 51 108 35 51 108 35 51 108 34 50 107 -+34 50 107 32 50 106 25 42 101 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 101 24 41 100 24 41 100 -+24 41 100 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+26 43 101 26 43 102 27 44 102 27 44 102 31 47 105 35 51 108 -+39 55 110 42 58 112 44 61 114 49 64 117 52 67 118 55 70 121 -+57 72 122 58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 59 74 124 58 73 123 58 73 123 58 73 123 58 73 123 -+58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 58 73 123 -+58 73 123 59 74 124 59 74 124 59 74 124 59 74 124 59 74 124 -+59 74 124 58 73 123 56 71 121 53 67 120 50 65 118 47 63 116 -+44 60 114 40 57 112 37 53 109 34 50 106 29 46 104 27 44 102 -+27 44 102 26 43 102 26 43 101 25 42 101 25 42 101 24 41 100 -+24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+25 42 100 38 54 110 51 66 119 55 69 121 56 70 122 56 70 122 -+55 69 121 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 55 70 121 56 70 122 -+55 70 121 55 70 121 54 70 120 54 70 120 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 54 69 120 55 70 121 55 70 121 54 69 120 54 69 120 -+53 68 119 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 53 68 119 53 67 120 54 69 120 46 61 115 27 44 102 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 33 49 106 -+48 63 117 51 66 119 49 64 117 49 64 117 49 64 117 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+49 65 117 50 65 118 48 65 116 48 65 116 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 -+49 65 117 48 64 117 48 64 117 37 53 109 25 42 101 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 37 53 109 45 60 114 -+45 60 114 44 59 113 44 59 113 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 44 60 114 45 60 114 44 60 114 -+43 60 114 44 60 114 44 60 114 44 60 114 43 59 113 32 48 107 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 25 42 100 -+36 52 108 40 56 111 39 55 110 39 55 111 40 56 111 38 54 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 38 54 110 -+39 55 111 28 45 103 24 41 100 24 41 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 25 42 101 33 49 106 35 51 108 -+35 51 108 35 51 108 35 51 108 34 50 107 35 51 108 34 50 107 -+34 50 107 27 44 103 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 101 24 41 100 24 41 100 -+24 41 100 24 41 100 24 41 100 23 40 100 23 40 100 23 40 100 -+23 40 100 23 40 100 25 42 101 27 44 102 29 45 103 31 47 105 -+31 47 105 32 50 106 34 50 107 35 51 108 36 52 108 36 52 108 -+36 52 108 36 52 108 36 52 108 36 52 108 35 51 108 34 50 107 -+34 50 107 33 50 105 31 47 105 29 46 104 27 44 103 26 43 101 -+25 42 100 23 40 99 23 40 100 23 40 100 23 40 100 24 41 100 -+24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 24 41 100 25 42 101 27 44 102 39 55 110 -+55 69 121 56 70 122 56 70 122 55 69 121 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 55 70 121 56 70 122 55 70 121 55 70 121 54 70 120 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 -+55 70 121 55 70 121 54 69 120 53 68 119 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 53 68 119 -+54 69 120 54 69 120 52 67 118 36 52 108 23 40 99 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 25 42 101 34 50 107 50 65 118 -+51 66 119 49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 -+49 65 117 48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 116 -+48 64 117 47 63 116 39 55 111 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 33 49 106 45 60 114 45 60 114 -+44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 44 60 114 45 60 114 45 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 44 60 113 43 60 114 37 53 109 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 32 48 105 -+39 55 110 39 55 111 40 56 111 40 56 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+33 49 106 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 30 46 104 34 50 107 35 51 108 -+35 51 108 35 51 108 35 51 108 34 50 107 34 50 107 34 50 107 -+31 47 105 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 -+29 47 104 25 42 101 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 -+24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 -+23 40 100 23 40 100 24 41 100 24 41 100 24 41 100 24 41 100 -+24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+24 41 100 27 44 102 33 49 106 43 58 114 54 69 120 57 72 122 -+56 70 122 56 71 121 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 55 70 121 -+56 70 122 56 70 122 55 70 121 55 70 121 54 70 120 54 70 120 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 54 69 120 55 70 121 55 70 121 -+54 69 120 54 69 120 53 68 119 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 53 68 119 54 69 120 -+53 68 119 43 59 113 28 45 103 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 26 43 102 38 54 110 51 66 119 51 66 119 -+50 65 118 49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 49 65 117 49 65 117 49 65 117 -+48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 48 64 117 49 65 117 48 64 116 48 64 117 -+48 64 117 37 53 109 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 31 47 105 44 60 114 46 61 115 44 59 113 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 44 60 114 44 60 114 43 60 114 44 60 114 -+44 60 114 43 59 113 44 60 114 38 56 110 24 41 101 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 27 44 103 38 54 110 -+40 56 111 39 55 111 40 56 111 39 55 111 38 54 111 39 55 111 -+39 55 111 39 55 111 39 55 111 38 54 110 39 55 111 37 53 109 -+25 42 101 24 41 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 26 43 102 34 50 107 35 51 108 35 51 108 -+35 51 108 35 51 108 34 50 107 34 50 107 33 49 106 33 49 106 -+26 43 102 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 28 45 103 -+51 66 119 44 60 115 35 51 108 25 42 100 23 40 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 23 40 99 29 46 104 -+40 56 111 48 63 117 55 69 121 56 70 122 56 70 122 55 69 121 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 55 70 121 56 70 122 56 70 122 -+55 70 121 55 70 121 54 70 120 54 70 120 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 54 69 120 -+53 68 119 53 68 119 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 53 68 119 54 69 120 55 70 121 49 63 116 -+34 50 107 25 42 101 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 28 45 103 43 60 114 51 66 119 50 65 118 50 65 118 -+49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 49 65 117 50 65 118 49 65 117 48 65 116 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 48 64 117 49 65 117 48 64 116 48 64 117 47 63 116 -+34 50 108 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 28 45 103 44 60 114 46 61 115 45 60 114 44 59 113 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 44 60 114 44 60 114 43 60 114 44 60 114 44 60 114 -+43 59 113 44 60 114 39 55 111 26 43 101 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 100 25 42 101 36 52 108 40 56 111 -+39 55 110 40 56 111 39 55 111 39 55 111 38 54 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 38 54 110 29 46 104 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 100 31 47 105 35 51 108 34 50 107 35 51 108 -+35 51 108 35 51 108 35 51 108 34 50 107 34 50 107 29 45 103 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 26 43 102 30 46 104 -+56 70 122 56 70 122 55 69 121 53 67 120 40 57 112 27 44 102 -+23 40 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 24 41 100 33 49 106 47 63 116 54 69 120 -+55 69 121 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 55 70 121 56 70 122 56 70 122 55 70 121 55 70 121 -+55 70 121 54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+54 69 120 55 70 121 54 69 120 54 69 120 54 69 120 53 68 119 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 53 68 119 54 69 120 53 68 119 38 56 110 26 43 102 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+29 46 104 47 63 116 51 66 119 50 65 118 49 64 117 49 64 117 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 49 65 117 50 65 118 49 65 117 48 65 116 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+48 64 117 49 65 117 48 64 117 48 63 117 47 63 116 35 51 108 -+25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+27 44 102 45 60 114 46 61 115 45 60 114 44 59 113 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+44 60 114 45 60 114 43 60 114 44 60 114 44 60 114 43 59 113 -+44 60 114 42 58 112 27 44 103 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 34 50 107 40 56 111 40 56 111 -+39 55 111 40 56 111 38 54 111 38 54 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 38 54 110 33 49 106 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 27 43 102 35 51 108 35 51 108 34 50 108 35 51 108 -+35 51 108 34 50 107 35 51 108 33 49 106 32 48 107 25 42 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 101 25 42 100 29 45 103 30 46 104 -+56 70 122 56 70 122 55 69 121 56 70 122 56 70 122 56 70 122 -+46 61 115 32 50 106 26 43 102 25 42 101 24 41 100 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 24 41 101 25 42 101 -+27 44 103 39 55 111 53 67 120 57 72 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 55 70 121 56 70 122 -+55 70 121 55 70 121 55 70 121 54 70 120 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 53 68 119 53 68 119 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 53 68 119 54 69 120 -+54 69 120 53 68 119 48 63 117 31 47 105 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 32 50 106 -+51 66 119 51 66 119 50 65 118 49 64 117 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 49 65 117 48 65 116 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 48 64 116 48 64 117 47 63 116 34 50 108 24 41 100 -+24 41 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 26 43 102 -+42 58 112 46 61 115 45 60 114 44 59 113 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 45 60 114 -+44 60 114 43 60 114 44 60 114 44 60 114 43 60 114 44 60 114 -+43 59 113 31 47 105 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 29 46 104 40 56 111 39 55 110 39 55 111 -+40 56 111 38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 38 54 110 39 55 111 38 54 110 25 42 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 34 50 107 35 51 108 35 51 108 35 51 108 35 51 108 -+35 51 108 35 51 108 34 50 107 33 49 106 28 45 103 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 26 43 102 29 45 103 30 46 104 -+56 70 122 56 70 122 56 70 122 56 70 122 55 69 121 56 70 122 -+56 70 122 59 72 123 51 66 119 40 56 111 33 49 106 27 44 103 -+23 40 100 24 41 100 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 23 40 100 25 42 101 29 47 104 36 52 108 46 61 115 -+55 69 121 57 72 122 56 70 122 55 69 121 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 55 70 121 56 70 122 56 70 122 55 70 121 -+55 70 121 54 70 120 54 70 120 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 54 69 120 55 70 121 54 69 120 54 69 120 -+54 69 120 53 68 119 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 53 68 119 54 69 120 54 69 120 -+49 64 117 37 53 109 24 41 101 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 26 43 102 38 54 110 53 67 120 -+50 65 118 50 65 118 49 64 117 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 50 65 118 -+49 65 117 49 65 117 48 65 116 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 49 65 117 -+48 64 116 48 64 117 46 61 115 33 49 106 23 40 99 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 26 43 101 39 55 111 -+46 61 115 45 60 114 44 59 113 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 44 60 114 45 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 43 59 113 44 60 114 -+34 50 107 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 101 -+24 41 100 27 44 102 38 54 110 38 56 110 39 55 111 40 56 111 -+39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 -+38 54 110 39 55 111 38 54 110 27 44 102 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+29 47 104 35 51 108 34 50 107 35 51 108 35 51 108 34 50 107 -+35 51 108 34 50 107 34 50 107 32 48 105 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 25 42 101 28 45 104 30 46 104 30 46 104 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 55 69 121 56 70 122 56 70 122 55 69 121 49 64 117 -+43 59 113 34 50 106 25 42 101 23 40 100 24 41 100 25 42 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 23 40 100 23 40 99 -+29 46 104 38 54 110 46 61 115 51 66 119 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+55 70 121 56 70 122 56 70 122 55 70 121 55 70 121 54 70 120 -+54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+54 69 120 55 70 121 55 70 121 54 69 120 54 69 120 53 68 119 -+53 68 119 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 53 68 119 54 69 120 53 68 119 39 55 110 -+28 45 103 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 27 44 103 44 60 114 51 66 119 50 65 118 -+49 64 117 49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 49 65 117 50 65 118 49 65 117 -+49 65 117 48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 48 64 117 49 65 117 48 64 116 -+48 64 117 46 61 115 31 47 105 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 101 39 55 110 46 61 115 -+45 60 114 44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 44 60 114 -+43 60 114 44 60 114 44 60 114 43 59 113 44 61 114 35 51 108 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+25 42 101 36 52 108 40 56 111 39 55 111 40 56 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+38 54 111 39 55 111 31 47 105 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 27 44 102 -+34 50 107 34 50 107 35 51 108 35 51 108 35 51 108 35 51 108 -+34 50 107 34 50 107 34 50 106 25 42 101 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 26 43 102 29 46 103 29 45 103 30 46 104 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 55 69 121 55 69 121 56 70 122 56 70 122 -+55 70 121 55 69 121 53 67 120 43 59 113 31 47 105 23 40 100 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 23 40 100 26 43 101 37 53 109 50 65 118 -+54 69 120 55 69 121 56 70 122 56 70 122 56 70 122 55 69 121 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 55 70 121 56 70 122 -+56 70 122 55 70 121 55 70 121 55 70 121 54 70 120 54 70 120 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 -+55 70 121 54 69 120 54 69 120 53 68 119 53 68 119 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+53 68 119 54 69 120 55 70 121 45 60 114 28 45 103 25 42 101 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+23 40 100 32 48 105 49 64 117 51 66 119 50 65 118 49 64 117 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 49 65 117 50 65 118 49 65 117 48 65 116 -+48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 48 64 117 49 65 117 48 64 116 48 64 117 -+46 61 115 29 46 104 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 39 55 111 46 61 115 45 60 114 -+44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 44 60 114 45 60 114 43 60 114 43 60 114 -+44 60 114 44 60 114 43 59 113 44 60 114 37 53 109 25 42 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+32 48 105 40 56 111 40 56 111 39 55 111 40 56 111 39 55 111 -+38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 38 54 110 -+39 55 111 34 50 107 25 42 101 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 32 48 107 -+35 51 108 35 51 108 35 51 108 35 51 108 35 51 108 35 51 108 -+34 50 107 34 50 107 28 45 103 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 29 46 104 30 46 104 29 45 103 29 45 103 -+56 70 122 55 70 121 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 55 69 121 56 70 122 56 70 122 56 70 122 53 67 120 -+40 57 112 30 46 104 26 43 102 25 42 101 24 41 100 24 41 100 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 101 24 41 100 24 41 100 24 41 100 25 42 101 26 43 101 -+27 44 102 35 51 108 47 63 116 56 70 122 56 70 122 56 70 122 -+55 69 121 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+55 70 121 56 70 122 56 70 122 55 70 121 55 70 121 55 70 121 -+54 70 120 54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 54 69 120 -+53 68 119 53 68 119 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 53 68 119 54 69 120 54 69 120 -+53 68 119 49 65 117 34 50 106 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 -+37 53 109 51 66 119 50 65 118 50 65 118 49 64 117 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 49 65 117 50 65 118 49 65 117 48 65 116 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+48 64 117 49 65 117 49 65 116 48 64 117 48 64 117 44 61 114 -+27 43 102 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 25 42 100 38 54 109 46 61 115 45 60 114 44 59 113 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 44 60 114 43 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 39 55 111 26 43 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 28 45 102 -+40 56 111 40 56 111 39 55 111 40 56 111 39 55 111 38 54 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+37 53 109 27 44 102 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 28 45 103 35 52 107 -+35 51 108 35 51 108 35 51 108 35 51 108 35 51 108 34 50 107 -+34 50 106 32 48 105 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 26 43 102 30 46 104 29 46 104 30 46 104 30 46 104 -+55 70 121 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+57 72 122 58 73 123 51 66 119 43 58 114 35 51 108 31 47 105 -+26 43 102 23 40 100 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+24 41 100 25 42 100 28 45 103 33 49 106 38 54 110 47 63 116 -+55 69 121 57 72 122 56 70 122 56 70 122 55 69 121 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 55 70 121 56 70 122 -+56 70 122 55 70 121 55 70 121 54 70 120 54 70 120 54 70 120 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+54 69 120 55 70 121 54 69 120 54 69 120 54 69 120 53 68 119 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 53 67 120 54 69 120 54 69 120 49 64 117 -+38 54 110 25 42 101 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 100 24 41 100 28 45 103 42 58 112 -+51 66 119 50 65 118 49 64 117 49 64 117 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 -+50 65 118 50 65 118 49 65 117 48 65 116 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 -+49 65 117 48 64 117 48 64 117 48 64 117 42 58 112 26 43 102 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+25 42 101 36 52 108 44 61 114 46 61 115 44 59 113 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+44 60 114 45 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+43 59 113 44 60 114 40 57 112 27 44 103 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 26 43 102 38 54 110 -+40 56 111 39 55 110 40 56 111 39 55 111 38 54 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 38 54 110 39 55 111 -+31 47 105 24 41 100 24 41 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 25 42 101 34 50 107 35 51 108 -+34 50 107 35 51 108 35 51 108 34 50 107 35 51 108 33 49 106 -+33 49 106 27 44 103 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+25 42 101 29 46 104 29 45 103 30 46 104 29 45 103 29 46 104 -+54 70 120 55 70 121 55 70 121 56 70 122 56 70 122 55 70 121 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 55 69 121 56 70 122 56 70 122 56 70 122 51 66 119 -+48 63 117 42 58 112 35 51 108 27 44 102 23 39 99 23 40 100 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 23 40 99 25 42 100 31 47 105 -+38 54 110 46 61 115 50 65 118 55 69 121 57 72 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 55 70 121 56 70 122 56 70 122 55 70 121 -+55 70 121 55 70 121 54 70 120 54 70 120 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 55 70 121 -+55 70 121 54 69 120 54 69 120 53 68 119 53 68 119 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 53 68 119 55 70 121 51 67 118 38 54 109 28 45 103 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 23 40 100 34 50 106 47 63 116 51 66 119 -+50 65 118 49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 50 65 118 -+49 65 117 49 65 117 48 65 116 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 49 65 117 -+48 64 117 48 63 117 48 64 117 38 56 110 26 43 101 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+35 52 107 45 60 114 46 61 115 45 60 114 44 59 113 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 -+45 60 114 44 60 114 44 60 114 44 60 114 44 60 114 43 59 113 -+44 60 114 43 59 113 29 46 103 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 25 42 101 36 52 108 40 56 111 -+39 55 110 39 55 111 40 56 111 38 54 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 38 54 110 39 55 111 34 50 107 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 32 48 105 35 51 108 34 50 107 -+35 51 108 35 51 108 34 50 107 35 51 108 34 50 107 33 49 106 -+31 47 105 24 41 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+27 44 103 30 46 104 29 46 104 30 46 104 30 46 104 29 45 103 -+54 70 120 54 70 120 54 70 120 55 70 121 55 70 121 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 55 69 121 56 70 122 56 70 122 -+56 70 122 55 69 121 55 69 121 54 69 120 50 65 118 40 56 111 -+31 47 105 23 40 100 24 41 100 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+23 40 100 27 43 101 35 51 108 44 60 115 53 67 120 55 69 121 -+55 69 121 56 70 122 56 70 122 56 70 122 55 69 121 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+55 70 121 56 70 122 56 70 122 55 70 121 55 70 121 54 70 120 -+54 70 120 54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 54 69 120 55 70 121 55 70 121 54 69 120 -+54 69 120 53 68 119 53 68 119 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 53 68 119 -+54 69 120 55 70 121 40 57 112 27 44 102 25 42 101 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 101 40 56 111 50 65 118 51 66 119 50 65 118 -+50 65 118 49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 -+48 65 116 48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 -+47 63 116 48 64 117 37 53 109 25 42 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 23 40 100 34 50 107 -+46 61 115 46 61 115 45 60 114 44 59 113 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+44 60 114 43 60 114 43 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 29 45 103 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 32 50 106 39 55 111 39 55 110 -+39 55 111 40 56 111 39 55 111 38 54 111 39 55 111 39 55 111 -+39 55 111 39 55 111 38 54 110 39 55 111 36 52 108 25 42 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 28 45 103 35 51 108 35 51 108 35 51 108 -+35 51 108 35 51 108 35 51 108 34 50 107 33 49 106 33 49 106 -+26 43 101 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 26 43 101 -+29 45 103 29 45 103 30 46 104 29 45 103 30 46 104 26 43 101 -+55 70 121 55 70 121 55 70 121 55 70 121 54 70 120 54 70 120 -+54 70 120 55 70 121 55 70 121 55 70 121 56 70 122 56 70 122 -+55 70 121 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 55 69 121 56 70 122 56 70 122 -+57 72 122 55 69 121 46 61 115 37 53 109 29 45 103 26 43 102 -+26 43 101 25 42 101 24 41 100 24 41 100 24 41 100 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 24 41 100 24 41 100 -+24 41 100 25 42 101 26 43 102 27 44 102 33 49 106 42 57 112 -+50 65 118 57 72 122 56 70 122 56 70 122 56 70 122 55 69 121 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 55 70 121 56 70 122 56 70 122 55 70 121 55 70 121 -+55 70 121 54 70 120 54 70 120 54 70 120 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 -+55 70 121 54 69 120 54 69 120 53 68 119 53 68 119 53 68 119 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 53 68 119 54 69 120 54 69 120 53 68 119 -+44 61 114 27 44 103 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 -+28 45 103 44 60 114 51 66 119 50 65 118 49 64 117 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 49 65 117 50 65 118 50 65 118 49 65 117 48 65 116 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 48 64 117 49 65 117 48 64 117 48 64 117 -+47 63 116 34 50 107 23 40 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 33 49 106 46 61 115 -+45 60 114 45 60 114 44 59 113 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 44 60 114 45 60 114 44 60 114 -+43 60 114 44 60 114 44 60 114 43 59 113 44 60 114 44 60 114 -+31 47 105 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 29 46 103 39 55 110 40 56 111 40 56 111 -+40 56 111 39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 -+39 55 111 38 54 110 39 55 111 38 54 110 27 44 102 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 25 42 102 34 50 107 34 50 107 35 51 108 35 51 108 -+35 51 108 35 51 108 35 51 108 34 50 107 34 50 107 29 45 103 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 28 45 103 -+30 46 104 30 46 104 29 45 103 30 46 104 28 45 103 24 41 100 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 54 70 120 54 70 120 55 70 121 55 70 121 55 70 121 -+56 70 122 56 70 122 56 70 122 55 70 121 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+55 69 121 56 70 122 56 70 122 57 72 122 59 72 123 53 67 120 -+46 61 115 39 55 111 35 52 107 31 47 105 28 45 103 25 42 101 -+23 40 100 24 41 100 24 41 100 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+24 41 100 23 40 100 24 41 100 27 43 102 30 46 104 33 49 106 -+37 53 109 43 58 114 49 64 117 55 70 121 57 72 122 57 72 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 55 70 121 -+56 70 122 56 70 122 55 70 121 55 70 121 55 70 121 54 70 120 -+54 70 120 54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 54 69 120 55 70 121 55 70 121 -+54 69 120 54 69 120 53 68 119 53 68 119 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+53 68 119 54 69 120 55 70 121 52 67 118 44 60 113 32 48 105 -+23 40 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 34 50 107 -+48 64 117 51 66 119 50 65 118 49 64 117 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+49 65 117 50 65 118 49 65 117 49 65 117 48 65 116 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+48 64 117 49 65 117 49 65 117 48 64 116 48 64 117 46 61 115 -+31 47 105 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 33 49 106 45 60 114 46 61 115 -+45 60 114 44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 44 60 114 45 60 114 44 60 114 43 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 43 59 113 34 50 107 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 26 43 102 38 54 109 40 56 111 39 55 110 40 56 111 -+39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 38 54 110 31 47 105 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+25 42 101 31 47 105 34 50 108 35 51 108 35 51 108 35 51 108 -+35 51 108 35 51 108 34 50 107 34 50 107 31 47 105 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 101 26 43 102 29 46 104 -+30 46 104 30 46 104 30 46 104 29 46 104 25 42 101 24 41 101 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 54 70 120 54 70 120 54 70 120 -+55 70 121 55 70 121 55 70 121 56 70 122 56 70 122 55 70 121 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 55 69 121 56 70 122 56 70 122 -+56 70 122 57 72 122 56 70 122 53 67 120 50 65 118 47 63 116 -+43 58 114 38 54 109 33 49 106 27 44 102 23 40 100 23 40 99 -+23 40 100 24 41 100 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 23 40 100 23 40 99 23 40 99 24 41 101 30 46 104 -+35 52 107 40 56 111 46 61 115 48 63 117 51 66 119 55 69 121 -+57 72 122 56 70 122 56 70 122 56 70 122 55 69 121 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 55 70 121 56 70 122 56 70 122 56 70 122 -+55 70 121 55 70 121 55 70 121 54 70 120 54 70 120 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 54 69 120 55 70 121 55 70 121 54 69 120 54 69 120 -+53 68 119 53 68 119 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 53 68 119 -+54 69 120 53 68 119 42 58 112 32 48 105 25 42 101 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 27 44 103 42 58 112 51 66 119 -+51 66 119 50 65 118 49 64 117 49 64 117 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 49 65 117 49 65 117 48 65 116 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 48 64 117 48 64 116 48 64 117 44 60 114 29 45 103 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 33 49 106 45 60 114 46 61 115 45 60 114 -+44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 44 60 114 45 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 43 59 113 44 60 114 36 52 108 25 42 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+25 42 101 37 53 109 40 56 111 39 55 110 39 55 111 40 56 111 -+39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 -+38 54 110 39 55 111 34 50 107 25 42 101 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 100 -+27 44 102 34 50 107 35 51 108 35 51 108 35 51 108 35 51 108 -+34 50 107 35 51 108 34 50 107 33 49 106 26 43 102 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 100 28 45 103 30 46 104 -+29 46 104 29 45 103 30 46 104 27 44 102 24 41 101 25 42 101 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+54 70 120 54 70 120 55 70 121 55 70 121 55 70 121 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 55 69 121 56 70 122 56 70 122 56 70 122 56 70 122 -+55 69 121 55 69 121 55 69 121 54 69 120 51 66 119 47 63 116 -+40 57 112 35 52 107 28 45 103 23 40 100 23 40 100 24 41 100 -+24 41 100 24 41 100 24 41 100 24 41 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 24 41 100 24 41 100 23 40 100 23 40 99 26 43 101 -+32 48 105 37 53 109 44 60 114 50 65 118 53 67 120 54 69 120 -+55 69 121 55 69 121 56 70 122 56 70 122 56 70 122 56 70 122 -+55 69 121 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+55 70 121 56 70 122 56 70 122 55 70 121 55 70 121 55 70 121 -+54 70 120 54 70 120 54 70 120 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 -+55 70 121 55 70 121 54 69 120 54 69 120 54 69 120 53 68 119 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 53 68 119 54 69 120 55 70 121 -+44 59 113 29 45 103 25 42 101 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 100 24 41 100 32 48 107 48 64 117 51 66 119 50 65 118 -+50 65 118 49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 50 65 118 -+49 65 117 48 65 116 48 65 116 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 -+48 64 117 47 63 116 48 64 117 42 58 112 25 42 101 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 32 48 107 46 61 115 46 61 115 45 60 114 44 59 113 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 44 60 114 43 60 114 43 60 114 44 60 114 -+44 60 114 43 59 113 44 60 114 37 53 109 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+35 51 108 40 56 111 39 55 110 39 55 111 40 56 111 39 55 111 -+38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 38 54 110 25 42 101 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+33 49 106 35 51 108 34 50 107 35 51 108 35 51 108 35 51 108 -+35 51 108 34 50 107 34 50 107 29 46 104 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 26 43 102 30 46 104 29 45 103 -+30 46 104 30 46 104 29 45 103 25 42 101 24 41 100 25 42 101 -+55 70 121 54 69 120 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 54 70 120 54 70 120 -+54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 56 70 122 -+56 70 122 55 70 121 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 55 69 121 56 70 122 56 70 122 -+56 70 122 56 70 122 57 72 122 56 70 122 50 65 118 46 61 115 -+40 56 111 36 52 108 31 47 105 27 44 102 27 43 102 26 43 102 -+26 43 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 -+24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 24 41 100 -+24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 -+24 41 100 24 41 100 24 41 100 24 41 100 25 42 100 25 42 101 -+25 42 101 25 42 101 26 43 101 26 43 102 27 44 102 28 45 103 -+33 49 106 38 54 110 43 58 114 48 63 117 55 69 121 57 72 122 -+56 70 122 56 70 122 56 70 122 56 70 122 55 69 121 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+55 70 121 56 70 122 56 70 122 56 70 122 55 70 121 55 70 121 -+55 70 121 54 70 120 54 70 120 54 70 120 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 54 69 120 55 70 121 55 70 121 54 69 120 54 69 120 -+54 69 120 53 68 119 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 53 68 119 -+54 69 120 54 69 120 53 68 119 53 68 119 45 60 114 28 45 103 -+23 40 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+26 43 102 40 57 112 53 67 120 51 66 119 50 65 118 49 64 117 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 49 65 117 50 65 118 50 65 118 48 65 116 -+48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 48 64 117 49 65 117 49 65 117 48 64 116 -+48 63 117 48 64 117 38 54 110 24 41 100 25 42 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+32 48 107 46 61 115 45 60 114 45 60 114 44 59 113 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 -+45 60 114 44 60 114 43 60 114 44 60 114 44 60 114 43 59 113 -+44 60 114 44 60 114 38 54 110 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 31 47 105 -+39 55 110 39 55 110 40 56 111 40 56 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 38 54 110 39 55 111 -+39 55 111 26 44 102 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 30 46 104 -+35 51 108 34 50 107 35 51 108 35 51 108 34 50 107 35 51 108 -+34 50 107 33 49 106 32 48 105 25 42 101 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 25 42 100 30 46 104 29 45 103 30 46 104 -+29 45 103 29 46 104 27 44 102 24 41 100 25 42 101 25 42 101 -+54 69 120 55 70 121 55 70 121 54 69 120 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 54 70 120 54 70 120 54 70 120 55 70 121 55 70 121 -+55 70 121 56 70 122 56 70 122 56 70 122 55 70 121 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 55 69 121 56 70 122 56 70 122 56 70 122 -+57 72 122 57 72 122 59 72 123 57 72 122 53 67 120 50 65 118 -+47 63 116 44 60 114 40 57 112 38 54 110 36 52 108 34 50 107 -+33 49 106 31 47 105 31 47 105 29 46 104 28 45 103 27 44 102 -+27 43 102 26 43 101 25 42 101 24 41 100 23 40 100 23 40 100 -+23 40 100 23 40 100 23 40 100 23 40 100 23 40 100 23 40 100 -+23 40 100 23 40 100 23 40 100 23 40 100 23 40 100 23 40 100 -+23 40 100 23 40 100 23 40 100 23 40 100 24 41 100 25 42 100 -+25 42 101 26 43 101 27 44 102 27 44 103 29 46 104 30 46 104 -+31 47 105 32 48 107 33 49 106 35 52 107 37 53 109 39 55 111 -+42 57 112 44 60 115 48 63 117 51 66 119 55 69 121 57 72 122 -+57 72 122 57 72 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 55 70 121 56 70 122 56 70 122 -+56 70 122 55 70 121 55 70 121 55 70 121 54 70 120 54 70 120 -+54 70 120 54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 -+55 70 121 55 70 121 54 69 120 54 69 120 53 68 119 53 68 119 -+53 68 119 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 50 65 118 42 58 112 29 47 104 23 40 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 32 50 106 -+47 63 116 51 66 119 50 65 118 49 64 117 49 64 117 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 49 65 117 50 65 118 49 65 117 49 65 117 48 65 116 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 48 64 117 48 64 116 48 64 117 -+47 63 116 34 50 107 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 33 49 106 -+45 60 114 46 61 115 45 60 114 44 59 113 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 45 60 114 -+44 60 114 43 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 38 56 110 26 43 102 25 42 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 28 45 103 39 55 110 -+40 56 111 39 55 111 40 56 111 39 55 111 38 54 111 39 55 111 -+39 55 111 39 55 111 39 55 111 38 54 110 39 55 111 39 55 111 -+30 46 104 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 27 44 103 35 51 108 -+34 50 107 35 51 108 35 51 108 35 51 108 35 51 108 34 50 107 -+34 50 107 34 50 107 27 44 102 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 101 28 45 103 30 46 104 30 46 104 30 46 104 -+30 46 104 29 45 103 24 41 101 24 41 100 25 42 101 25 42 101 -+53 68 119 54 69 120 54 69 120 55 70 121 55 70 121 54 69 120 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 54 70 120 54 70 120 -+54 70 120 55 70 121 55 70 121 55 70 121 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 55 69 121 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 57 72 122 57 72 122 56 70 122 -+55 69 121 53 67 120 51 66 119 50 65 118 50 65 118 49 64 117 -+48 63 117 47 63 116 47 63 116 46 61 115 44 60 115 45 60 114 -+44 60 114 43 58 114 43 58 114 42 57 112 40 57 112 40 57 112 -+40 57 112 40 57 112 40 57 112 40 57 112 42 57 112 42 57 112 -+43 58 114 43 58 114 44 60 114 45 60 114 44 60 115 46 61 115 -+47 63 116 48 63 117 48 63 117 49 64 117 50 65 118 51 66 119 -+53 67 120 54 69 120 55 69 121 56 70 122 57 72 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 71 121 -+55 69 121 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+55 70 121 56 70 122 56 70 122 56 70 122 55 70 121 55 70 121 -+55 70 121 55 70 121 54 70 120 54 70 120 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 54 69 120 55 70 121 55 70 121 55 70 121 -+54 69 120 54 69 120 54 69 120 53 68 119 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 53 68 119 54 69 120 55 70 121 49 64 117 -+37 53 109 29 46 104 24 41 100 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 23 40 100 27 43 102 40 57 112 50 65 118 -+51 66 119 50 65 118 49 64 117 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+49 65 117 50 65 118 49 65 117 49 65 117 48 65 116 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 48 64 117 48 64 117 48 64 116 48 64 117 44 60 115 -+29 47 104 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 32 50 106 45 60 114 -+46 61 115 45 60 114 44 59 113 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 44 60 114 45 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 43 59 113 44 60 114 -+40 56 111 27 43 102 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 26 43 101 38 54 110 40 56 111 -+39 55 110 40 56 111 39 55 111 39 55 111 38 54 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 33 49 106 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 25 42 101 33 49 106 35 51 108 -+35 51 108 35 51 108 35 51 108 34 50 107 35 51 108 34 50 107 -+34 50 107 30 46 104 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 26 43 101 29 45 103 29 45 103 30 46 104 29 45 103 -+30 46 104 26 43 102 24 41 100 25 42 101 25 42 101 25 42 101 -+53 68 119 53 68 119 54 69 120 54 69 120 54 69 120 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+54 70 120 54 70 120 54 70 120 54 70 120 55 70 121 55 70 121 -+55 70 121 55 70 121 56 70 122 56 70 122 56 70 122 55 70 121 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 55 70 121 55 69 121 55 69 121 55 69 121 55 69 121 -+55 69 121 55 69 121 55 69 121 55 69 121 55 69 121 55 69 121 -+55 69 121 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 55 69 121 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 55 70 121 56 70 122 56 70 122 -+56 70 122 55 70 121 55 70 121 55 70 121 55 70 121 54 70 120 -+54 70 120 54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+54 69 120 55 70 121 55 70 121 54 69 120 54 69 120 54 69 120 -+53 68 119 53 68 119 53 68 119 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+53 68 119 54 69 120 55 70 121 48 63 117 34 50 106 25 42 101 -+25 42 101 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 34 50 107 49 64 117 50 65 118 50 65 118 -+50 65 118 49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 50 65 118 -+50 65 118 49 65 117 48 65 116 48 65 116 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+48 64 117 49 65 117 47 63 116 49 65 117 40 57 112 26 43 101 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 23 40 100 33 49 106 46 61 115 46 61 115 -+45 60 114 44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 43 60 114 -+43 60 114 44 60 114 44 60 114 43 59 113 44 60 114 42 58 112 -+26 43 101 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 37 53 109 40 56 111 39 55 110 -+39 55 111 40 56 111 38 54 111 38 54 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 37 53 109 26 43 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 25 42 100 31 47 105 35 51 108 34 50 107 -+35 51 108 35 51 108 35 51 108 35 51 108 34 50 107 34 50 107 -+33 49 106 25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+25 42 101 27 44 103 30 46 104 30 46 104 30 46 104 30 46 104 -+27 44 103 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+54 69 120 54 69 120 54 69 120 54 69 120 53 68 119 53 68 119 -+53 68 119 54 69 120 54 69 120 54 69 120 55 70 121 55 70 121 -+54 69 120 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 54 70 120 54 70 120 54 70 120 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 56 70 122 56 70 122 56 70 122 -+56 70 122 55 70 121 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 55 70 121 56 70 122 56 70 122 56 70 122 56 70 122 -+55 70 121 55 70 121 55 70 121 55 70 121 54 70 120 54 70 120 -+54 70 120 54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 54 69 120 55 70 121 55 70 121 55 70 121 54 69 120 -+54 69 120 53 68 119 53 68 119 53 68 119 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 53 68 119 54 69 120 54 69 120 53 68 119 -+52 67 118 46 61 115 32 48 105 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 -+27 44 102 40 57 112 51 66 119 50 65 118 50 65 118 49 64 117 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 49 65 117 50 65 118 49 65 117 -+48 65 116 48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 -+48 64 116 48 64 117 47 63 116 38 54 110 25 42 101 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 34 50 107 46 61 115 45 60 114 45 60 114 -+44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 44 60 114 45 60 114 44 60 114 43 60 114 44 60 114 -+44 60 114 43 59 113 44 60 114 44 60 114 42 58 112 25 42 102 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 34 50 108 40 56 111 39 55 110 40 56 111 -+39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 38 54 110 39 55 111 38 54 110 27 44 103 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 27 44 102 34 50 108 35 51 108 35 51 108 -+35 51 108 35 51 108 34 50 107 34 50 107 33 49 106 34 50 107 -+26 43 102 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+26 43 102 29 46 104 29 45 103 29 46 104 30 46 104 30 46 104 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 53 68 119 53 68 119 54 69 120 54 69 120 54 69 120 -+55 70 121 55 70 121 55 70 121 54 69 120 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 54 70 120 54 70 120 -+54 70 120 54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 55 70 121 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 55 70 121 55 70 121 55 70 121 55 70 121 -+54 70 120 54 70 120 54 70 120 54 70 120 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 -+55 70 121 55 70 121 54 69 120 54 69 120 54 69 120 54 69 120 -+53 68 119 53 68 119 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+53 68 119 54 69 120 54 69 120 54 69 120 49 64 117 40 57 112 -+31 47 105 23 40 100 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 26 43 101 34 50 108 -+48 63 117 52 67 118 50 65 118 49 64 117 49 64 117 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 49 65 117 50 65 118 50 65 118 49 65 117 48 65 116 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 48 64 117 48 64 116 48 64 116 -+48 64 117 46 61 115 34 50 107 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+25 42 100 35 52 107 45 60 114 46 61 115 45 60 114 44 59 113 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+44 60 114 45 60 114 44 60 114 43 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 40 57 112 27 44 102 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+25 42 100 32 48 105 39 55 110 39 55 110 39 55 111 40 56 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+38 54 110 39 55 111 38 54 111 29 46 104 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 25 42 101 33 49 106 35 51 108 34 50 107 35 51 108 -+35 51 108 34 50 107 35 51 108 34 50 107 34 50 107 29 46 104 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 101 25 42 101 -+28 45 103 30 46 104 29 46 104 30 46 104 30 46 104 27 44 102 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 53 68 119 53 68 119 53 68 119 -+54 69 120 54 69 120 54 69 120 55 70 121 55 70 121 54 69 120 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 54 70 120 54 70 120 54 70 120 54 70 120 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 55 70 121 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 55 70 121 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 54 70 120 54 70 120 54 70 120 54 70 120 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 54 69 120 55 70 121 55 70 121 55 70 121 -+54 69 120 54 69 120 54 69 120 53 68 119 53 68 119 53 68 119 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 53 68 119 54 69 120 -+55 70 121 54 69 120 44 59 113 34 50 107 28 45 103 23 40 100 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 31 47 105 43 60 114 51 66 119 -+51 66 119 50 65 118 49 64 117 49 64 117 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+49 65 117 50 65 118 49 65 117 49 65 117 48 65 116 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 48 64 117 49 65 117 49 65 117 48 64 117 48 64 117 -+42 57 112 29 46 104 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 100 24 41 100 -+36 52 108 45 60 114 46 61 115 45 60 114 44 59 113 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 -+45 60 114 44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+43 59 113 44 60 114 42 58 112 28 45 103 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+29 46 104 39 55 110 40 56 111 39 55 111 40 56 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+38 54 111 39 55 111 31 47 105 24 41 100 24 41 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 101 -+24 41 100 31 47 105 35 51 108 34 50 107 35 51 108 35 51 108 -+35 51 108 35 51 108 34 50 107 33 49 106 32 48 107 25 42 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 27 44 103 -+30 46 104 29 45 103 30 46 104 30 46 104 29 45 103 25 42 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+53 68 119 53 68 119 54 69 120 54 69 120 54 69 120 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+54 70 120 54 70 120 54 70 120 54 70 120 54 70 120 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 55 70 121 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 54 70 120 54 70 120 54 70 120 -+54 70 120 54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+54 69 120 55 70 121 55 70 121 54 69 120 54 69 120 54 69 120 -+53 68 119 53 68 119 53 68 119 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 53 68 119 54 69 120 55 69 121 52 67 118 -+38 54 110 28 45 102 25 42 101 24 41 100 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 101 40 56 111 50 65 118 51 66 119 50 65 118 -+50 65 118 49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 -+50 65 118 49 65 117 48 65 116 48 65 116 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+48 64 117 49 65 117 48 64 117 48 64 116 48 64 117 38 56 110 -+26 43 101 24 41 100 25 42 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 38 54 110 -+46 61 115 46 61 115 45 60 114 44 59 113 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+44 60 114 43 60 114 43 60 114 44 60 114 44 60 114 43 59 113 -+44 60 114 43 59 113 28 45 103 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 26 43 102 -+39 55 111 40 56 111 39 55 110 40 56 111 39 55 111 38 54 111 -+38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 38 54 110 -+39 55 111 34 50 107 25 42 101 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+29 45 103 35 51 108 35 51 108 35 51 108 35 51 108 35 51 108 -+34 50 107 35 51 108 34 50 107 33 49 106 27 44 102 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 30 46 104 -+30 46 104 30 46 104 30 46 104 29 45 103 27 44 102 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+52 67 118 54 69 120 54 69 120 54 69 120 53 68 119 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 53 68 119 53 68 119 -+53 68 119 54 69 120 54 69 120 54 69 120 54 69 120 55 70 121 -+55 70 121 55 70 121 54 69 120 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 54 70 120 54 70 120 -+54 70 120 54 70 120 54 70 120 54 70 120 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 55 70 121 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 55 70 121 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 54 70 120 -+54 70 120 54 70 120 54 70 120 54 70 120 54 70 120 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 54 69 120 -+54 69 120 53 68 119 53 68 119 53 68 119 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 53 68 119 54 69 120 54 69 120 -+54 69 120 53 68 119 52 67 118 47 63 116 34 50 107 24 41 100 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 25 42 101 -+32 48 107 49 64 117 51 66 119 50 65 118 50 65 118 49 64 117 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 49 65 117 50 65 118 50 65 118 49 65 117 -+48 65 116 48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 49 65 117 -+48 64 116 48 64 117 48 64 117 47 63 116 35 52 107 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 25 42 101 38 54 109 46 61 115 -+45 60 114 45 60 114 44 59 113 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 44 60 114 45 60 114 44 60 114 -+43 60 114 44 60 114 44 60 114 43 60 114 44 60 113 44 60 114 -+43 59 113 27 44 103 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 38 54 110 -+40 56 111 39 55 111 40 56 111 39 55 111 38 54 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 38 54 110 39 55 111 -+36 52 108 26 43 102 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 26 43 102 -+34 50 107 34 50 107 35 51 108 35 51 108 35 51 108 35 51 108 -+35 51 108 34 50 107 34 50 107 29 47 104 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 28 45 103 29 45 103 -+30 46 104 29 46 104 30 46 104 29 45 103 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+34 50 106 42 58 112 49 64 117 53 68 119 54 69 120 54 69 120 -+54 69 120 53 68 119 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 53 68 119 53 68 119 53 68 119 54 69 120 54 69 120 -+54 69 120 54 69 120 55 70 121 55 70 121 55 70 121 54 69 120 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 54 70 120 54 70 120 -+54 70 120 54 70 120 54 70 120 54 70 120 54 70 120 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 56 70 122 56 70 122 56 70 122 -+56 70 122 56 70 122 56 70 122 56 70 122 56 70 122 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 54 70 120 54 70 120 54 70 120 -+54 70 120 54 70 120 54 70 120 54 70 120 54 70 120 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 54 69 120 55 70 121 55 70 121 55 70 121 -+54 69 120 54 69 120 54 69 120 54 69 120 53 68 119 53 68 119 -+53 68 119 53 68 119 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 55 69 121 51 66 119 -+46 61 115 39 55 110 29 46 103 23 40 99 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 31 47 105 42 58 112 -+51 66 119 50 65 118 50 65 118 49 64 117 49 64 117 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 49 65 117 49 65 117 48 65 116 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 48 64 117 49 65 117 48 64 117 -+48 63 117 48 64 117 43 59 113 29 46 104 23 40 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 26 43 102 38 54 110 46 61 115 45 60 114 -+44 59 113 44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 44 60 114 45 60 114 44 60 114 43 60 114 -+44 60 114 44 60 114 44 60 114 44 60 113 44 60 114 42 58 112 -+28 45 103 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 25 42 101 36 52 108 40 56 111 -+39 55 110 40 56 111 39 55 111 38 54 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 38 54 110 39 55 111 38 54 110 -+28 45 103 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 32 48 105 -+35 51 108 35 51 108 35 51 108 35 51 108 35 51 108 35 51 108 -+34 50 107 34 50 107 32 48 107 25 42 101 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 101 26 43 102 29 45 103 29 46 104 -+30 46 104 30 46 104 30 46 104 25 42 102 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 28 45 103 33 49 106 40 57 112 50 65 118 -+55 70 121 54 69 120 54 69 120 53 68 119 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 53 68 119 53 68 119 -+53 68 119 54 69 120 54 69 120 54 69 120 54 69 120 55 70 121 -+55 70 121 55 70 121 54 69 120 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 54 70 120 -+54 70 120 54 70 120 54 70 120 54 70 120 54 70 120 54 70 120 -+54 70 120 54 70 120 54 70 120 54 70 120 54 70 120 54 70 120 -+54 70 120 54 70 120 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+54 70 120 54 70 120 54 70 120 54 70 120 54 70 120 54 70 120 -+54 70 120 54 70 120 54 70 120 54 70 120 54 70 120 54 70 120 -+54 70 120 54 70 120 54 70 120 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 -+55 70 121 55 70 121 55 70 121 54 69 120 54 69 120 54 69 120 -+54 69 120 53 68 119 53 68 119 53 68 119 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 53 68 119 -+54 69 120 55 70 121 55 70 121 47 63 116 37 53 109 31 47 105 -+26 43 102 23 40 100 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 23 40 99 27 44 103 40 56 111 48 63 117 51 66 119 -+50 65 118 49 64 117 49 64 117 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+49 65 117 50 65 118 49 65 117 49 65 117 48 65 116 48 65 116 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 48 64 116 48 64 117 -+48 64 117 37 53 109 26 43 102 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 26 43 101 39 55 111 46 61 115 45 60 114 44 59 113 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 44 60 114 45 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 43 60 114 44 60 114 42 58 112 29 46 104 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 25 42 101 34 50 107 40 56 111 39 55 110 -+39 55 111 40 56 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 38 54 111 39 55 111 29 46 104 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 29 46 104 35 51 108 -+35 51 108 35 51 108 35 51 108 35 51 108 34 50 107 35 51 108 -+34 50 107 33 49 106 26 43 102 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 25 42 101 29 45 103 30 46 104 30 46 104 -+29 45 103 30 46 104 27 44 103 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 24 41 100 25 42 101 26 43 102 -+32 50 106 43 59 113 53 67 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 53 68 119 53 68 119 53 68 119 54 69 120 54 69 120 -+54 69 120 54 69 120 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 54 70 120 54 70 120 54 70 120 54 70 120 -+54 70 120 54 70 120 54 70 120 54 70 120 54 70 120 54 70 120 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 54 69 120 55 70 121 55 70 121 55 70 121 -+54 69 120 54 69 120 54 69 120 54 69 120 53 68 119 53 68 119 -+53 68 119 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 53 67 120 54 69 120 54 69 120 55 70 121 -+50 65 118 39 55 110 28 45 102 26 43 101 25 42 101 24 41 100 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 101 36 52 108 48 63 117 51 66 119 50 65 118 50 65 118 -+50 65 118 49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 -+50 65 118 49 65 117 49 65 117 48 65 116 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 48 64 117 48 64 117 48 64 116 48 64 117 47 63 116 -+31 47 105 25 42 101 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+27 44 102 43 58 114 46 61 115 45 60 114 44 59 113 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 44 60 114 43 60 114 43 60 114 44 60 114 -+44 60 114 43 59 113 44 60 114 43 60 114 29 45 103 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 32 48 107 40 56 111 40 56 111 39 55 111 -+40 56 111 39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 38 54 110 39 55 111 31 47 105 25 42 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 26 43 101 35 51 108 35 51 108 -+34 50 107 35 51 108 35 51 108 34 50 107 35 51 108 34 50 107 -+34 50 106 29 45 103 25 42 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 27 43 102 30 46 104 30 46 104 30 46 104 -+30 46 104 29 45 103 25 42 101 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 100 -+24 41 100 24 41 100 25 42 101 34 50 107 46 61 115 52 67 118 -+53 68 119 54 69 120 54 69 120 54 69 120 53 68 119 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 53 68 119 53 68 119 53 68 119 54 69 120 -+54 69 120 54 69 120 54 69 120 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 54 69 120 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 -+54 69 120 54 69 120 54 69 120 53 68 119 53 68 119 53 68 119 -+53 68 119 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 53 68 119 54 69 120 54 69 120 -+54 69 120 53 68 119 52 67 118 50 65 118 40 57 112 29 46 103 -+24 41 100 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 25 42 101 30 46 104 -+46 61 115 52 67 118 51 66 119 49 64 117 49 64 117 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 49 65 117 50 65 118 49 65 117 49 65 117 -+49 65 117 48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 49 65 117 -+48 64 117 48 64 116 48 63 117 47 63 116 42 58 112 25 43 102 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 28 45 103 -+43 60 114 46 61 115 45 60 114 44 59 113 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 -+45 60 114 44 60 114 43 60 114 44 60 114 44 60 114 43 59 113 -+44 60 114 44 60 114 43 59 113 27 44 103 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 30 46 104 40 57 112 39 55 110 39 55 111 40 56 111 -+39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 34 50 107 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 34 50 107 35 51 108 35 51 108 -+35 51 108 35 51 108 34 50 107 35 51 108 34 50 107 34 50 107 -+31 47 105 25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 25 42 101 29 46 104 29 45 103 30 46 104 30 46 104 -+30 46 104 26 43 102 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 23 39 99 27 44 102 -+35 51 108 43 59 113 48 63 117 52 67 118 55 70 121 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 53 68 119 -+53 68 119 53 68 119 53 68 119 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 54 69 120 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 54 69 120 55 70 121 55 70 121 55 70 121 55 70 121 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 53 68 119 -+53 68 119 53 68 119 53 68 119 53 68 119 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+53 68 119 54 69 120 54 69 120 54 69 120 54 69 120 50 65 118 -+46 61 115 40 56 111 32 48 107 23 40 100 23 40 100 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 101 24 41 100 24 41 101 31 47 105 42 58 112 53 67 120 -+51 66 119 50 65 118 49 64 117 49 64 117 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 49 65 117 50 65 118 49 65 117 49 65 117 48 65 116 -+48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 -+48 64 116 48 64 117 46 61 115 36 52 108 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 100 24 41 100 31 47 105 43 58 114 -+46 61 115 45 60 114 44 59 113 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 45 60 114 -+44 60 114 43 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 42 58 112 28 45 103 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+29 46 104 40 56 111 39 55 111 39 55 111 40 56 111 39 55 111 -+38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+38 54 110 39 55 111 36 52 108 26 43 102 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 25 42 100 31 47 105 35 51 108 34 50 107 35 51 108 -+35 51 108 34 50 107 35 51 108 34 50 107 34 50 107 33 49 106 -+26 43 101 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 101 29 46 103 30 46 104 29 46 104 30 46 104 30 46 104 -+27 44 103 25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 24 41 100 27 44 102 32 48 105 37 53 109 44 60 114 -+52 67 118 55 70 121 55 69 121 54 69 120 54 69 120 53 67 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 53 68 119 53 68 119 53 68 119 -+53 68 119 53 68 119 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 54 69 120 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 53 68 119 53 68 119 53 68 119 53 68 119 53 68 119 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+55 70 121 55 70 121 49 64 117 40 57 112 34 50 107 30 46 104 -+25 43 102 24 41 100 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+23 40 99 30 46 104 42 58 112 49 64 117 51 66 119 50 65 118 -+50 65 118 49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 49 65 117 48 65 116 48 65 116 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 48 64 117 49 65 117 48 64 116 48 64 117 -+50 65 118 40 57 112 29 47 104 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 23 40 100 34 50 107 44 60 114 46 61 115 -+45 60 114 44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 44 60 114 45 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 43 59 113 44 60 114 -+42 58 112 29 45 103 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 100 24 41 100 28 45 103 -+38 54 110 40 56 111 39 55 110 40 56 111 39 55 111 38 54 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 38 54 110 -+39 55 111 38 54 110 27 44 102 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 28 45 104 34 50 107 34 50 107 35 51 108 35 51 108 -+35 51 108 35 51 108 34 50 107 34 50 107 34 50 107 27 44 103 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+27 44 102 30 46 104 29 45 103 30 46 104 29 45 103 29 46 104 -+25 42 102 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 24 41 100 25 42 101 26 43 101 -+26 43 101 32 48 105 40 57 112 51 66 119 55 69 121 54 69 120 -+54 69 120 53 68 119 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 53 68 119 53 68 119 53 68 119 53 68 119 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 54 69 120 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+54 69 120 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 53 68 119 53 68 119 53 68 119 -+53 68 119 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+53 68 119 54 69 120 54 69 120 54 69 120 54 69 120 47 63 116 -+37 53 109 28 45 103 26 43 101 25 42 101 24 41 100 24 41 100 -+24 41 100 24 41 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 27 43 102 -+42 57 112 49 64 117 51 66 119 50 65 118 50 65 118 49 64 117 -+49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 -+49 65 117 49 65 117 49 65 117 48 65 116 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 48 64 117 49 65 117 48 64 117 48 64 117 48 64 117 -+35 52 107 25 42 101 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 36 52 108 45 60 114 46 61 115 45 60 114 -+44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 43 60 114 -+43 60 114 44 60 114 44 60 114 43 59 113 44 60 114 42 58 112 -+27 44 102 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 26 43 102 37 53 109 -+40 56 111 39 55 110 40 56 111 39 55 111 38 54 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 27 44 102 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+26 43 102 34 50 107 35 51 108 35 51 108 35 51 108 35 51 108 -+35 51 108 35 51 108 34 50 107 34 50 107 29 47 104 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 -+29 45 103 29 45 103 30 46 104 29 46 104 30 46 104 27 44 103 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 23 40 100 28 45 103 38 54 109 -+46 61 115 52 67 118 52 67 118 53 68 119 54 69 120 54 69 120 -+54 69 120 54 69 120 53 68 119 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+53 68 119 53 68 119 53 68 119 53 68 119 53 68 119 53 68 119 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 70 121 55 70 121 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 53 68 119 53 68 119 53 68 119 53 68 119 -+53 68 119 53 68 119 53 68 119 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+55 68 119 54 69 120 54 69 120 54 69 120 53 68 119 53 68 119 -+52 67 118 50 65 118 43 59 113 33 49 106 25 42 101 23 40 100 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 25 42 101 26 43 102 37 53 109 50 65 118 -+51 66 119 50 65 118 49 64 117 49 64 117 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 49 65 117 -+48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 49 65 117 -+48 64 117 48 64 116 48 64 117 47 63 116 44 60 114 30 46 104 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+25 42 101 37 53 109 46 61 115 45 60 114 45 60 114 44 59 113 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 44 60 114 45 60 114 44 60 114 43 60 114 44 60 114 -+44 60 114 43 59 113 44 60 114 44 60 114 42 58 112 26 43 102 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 25 42 101 36 52 108 40 56 111 -+39 55 110 40 56 111 40 56 111 39 55 111 38 54 111 39 55 111 -+39 55 111 39 55 111 39 55 111 38 54 110 39 55 111 39 55 111 -+29 46 103 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 -+32 48 107 35 51 108 34 50 107 35 51 108 35 51 108 34 50 107 -+35 51 108 34 50 107 34 50 106 32 48 107 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 42 100 28 45 102 -+30 46 104 30 46 104 29 45 103 30 46 104 29 46 104 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 23 40 100 -+23 40 99 25 42 101 32 50 106 38 54 110 44 60 114 48 63 117 -+51 66 119 54 69 120 55 69 121 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+53 68 119 53 68 119 53 68 119 53 68 119 53 68 119 53 68 119 -+53 68 119 53 68 119 53 68 119 53 68 119 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 53 68 119 53 68 119 -+53 68 119 53 68 119 53 68 119 53 68 119 53 68 119 53 68 119 -+53 68 119 53 68 119 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 53 68 119 54 69 120 54 69 120 54 69 120 -+55 70 121 53 67 120 49 65 117 46 61 115 42 58 112 36 52 108 -+29 46 103 23 40 100 23 40 99 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 28 45 103 36 52 108 48 63 117 52 67 118 50 65 118 -+50 65 118 49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+49 65 117 50 65 118 49 65 117 49 65 117 49 65 117 48 65 116 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 48 64 117 49 65 117 48 64 117 -+48 64 117 48 64 117 46 61 115 38 54 110 25 42 101 24 41 100 -+25 42 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 27 43 102 -+38 54 110 46 61 115 45 60 114 44 59 113 44 59 113 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+44 60 114 45 60 114 44 60 114 43 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 40 56 111 27 44 102 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 25 42 101 36 52 108 40 56 111 39 55 110 -+39 55 111 40 56 111 39 55 111 38 54 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 38 54 110 32 48 107 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 30 46 104 -+35 51 108 34 50 107 35 51 108 35 51 108 35 51 108 35 51 108 -+34 50 107 33 49 106 33 49 106 27 44 102 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 101 26 43 101 29 45 103 -+30 46 104 30 46 104 30 46 104 29 46 104 25 42 101 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 27 44 102 -+31 47 105 34 50 106 39 55 110 44 60 114 50 65 118 55 70 121 -+55 70 121 55 70 121 54 69 120 54 69 120 53 67 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 53 68 119 53 68 119 -+53 68 119 53 68 119 53 68 119 53 68 119 53 68 119 53 68 119 -+53 68 119 53 68 119 53 68 119 53 68 119 53 68 119 53 68 119 -+53 68 119 53 68 119 53 68 119 53 68 119 53 68 119 53 68 119 -+53 68 119 53 68 119 53 68 119 53 68 119 53 68 119 53 68 119 -+53 68 119 53 68 119 53 68 119 53 68 119 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 53 68 119 54 69 120 -+54 69 120 55 70 121 56 71 121 53 67 120 48 63 117 42 58 112 -+37 53 109 32 50 106 29 46 104 26 43 101 24 41 100 24 41 100 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 23 40 99 27 44 103 -+38 54 110 47 63 116 51 66 119 50 65 118 50 65 118 49 64 117 -+49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 -+50 65 118 49 65 117 49 65 117 48 65 116 48 65 116 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 47 63 116 -+48 64 117 42 58 112 31 47 105 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 23 40 100 29 46 104 40 57 112 -+46 61 115 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+43 59 113 44 60 114 39 55 111 27 44 102 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 25 42 101 35 52 107 40 56 111 39 55 110 39 55 111 -+40 56 111 39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 38 54 110 39 55 111 34 50 107 25 42 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 28 45 103 35 52 107 -+35 51 108 35 51 108 35 51 108 35 51 108 34 50 107 35 51 108 -+34 50 107 34 50 107 29 46 104 24 41 101 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 29 45 103 30 46 104 -+29 45 103 29 45 103 30 46 104 27 44 102 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+24 41 100 24 41 100 25 42 101 25 42 101 26 43 102 27 44 103 -+34 50 106 40 57 112 48 63 117 54 69 120 55 70 121 54 69 120 -+54 69 120 54 69 120 53 68 119 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 53 68 119 -+54 69 120 54 69 120 54 69 120 54 69 120 55 70 121 51 66 119 -+45 60 114 38 54 109 31 47 105 27 44 102 26 43 101 25 42 101 -+25 42 101 24 41 100 24 41 100 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 26 43 101 39 55 111 49 64 117 -+50 65 118 50 65 118 50 65 118 49 64 117 49 64 117 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+49 65 117 48 65 116 48 65 116 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 48 64 117 48 64 117 48 64 116 48 64 117 48 64 117 -+35 51 108 25 42 101 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 31 47 105 44 59 113 46 61 115 -+45 60 114 44 59 113 44 59 113 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 45 60 114 -+44 60 114 44 60 114 43 60 114 44 60 114 44 60 114 43 59 113 -+44 60 114 38 56 110 25 42 101 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+25 42 101 34 50 107 40 56 111 39 55 110 39 55 111 40 56 111 -+39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 38 54 110 39 55 111 36 52 108 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 27 43 102 34 50 107 35 51 108 -+34 50 107 35 51 108 35 51 108 34 50 107 35 51 108 34 50 107 -+34 50 107 32 48 107 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 27 44 102 30 46 104 29 45 103 -+30 46 104 30 46 104 29 45 103 25 42 101 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 24 41 100 23 40 100 24 41 100 30 46 104 36 52 108 -+42 58 112 48 63 117 51 67 118 52 67 118 52 67 118 53 68 119 -+53 68 119 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 53 68 119 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 53 68 119 53 68 119 52 67 118 52 67 118 -+50 65 118 44 61 114 39 55 110 33 49 106 26 43 102 23 40 100 -+24 41 100 24 41 100 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+25 42 101 26 43 102 37 53 109 50 65 118 51 66 119 50 65 118 -+49 64 117 49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+49 65 117 50 65 118 50 65 118 49 65 117 49 65 117 48 65 116 -+48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+48 64 117 48 64 116 48 63 117 47 63 116 43 60 114 27 44 103 -+24 41 100 25 42 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 25 42 101 32 48 107 46 61 115 46 61 115 45 60 114 -+44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 44 60 114 45 60 114 44 60 114 43 60 114 -+44 60 114 44 60 114 44 60 114 43 59 113 44 60 114 44 60 114 -+37 53 109 24 41 100 25 42 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 -+31 47 105 40 56 111 40 56 111 40 56 111 40 56 111 39 55 111 -+38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 38 54 111 -+39 55 111 39 55 111 37 53 109 25 42 101 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 25 42 101 32 48 107 35 51 108 35 51 108 -+35 51 108 35 51 108 35 51 108 35 51 108 34 50 107 34 50 106 -+34 50 107 25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 25 42 101 30 46 104 29 45 103 30 46 104 -+29 45 103 29 45 103 27 43 102 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 24 41 100 -+23 40 100 23 40 99 24 41 100 29 46 104 33 49 106 37 53 109 -+40 57 112 45 60 114 46 61 115 48 64 116 50 65 118 52 67 118 -+54 69 120 55 70 121 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 53 68 119 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 53 67 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+55 69 121 55 70 121 53 68 119 51 66 119 49 65 117 47 63 116 -+46 61 115 43 59 113 40 56 111 36 52 108 31 47 105 27 44 102 -+23 40 99 23 40 99 23 40 100 24 41 100 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 24 41 101 29 47 104 -+38 54 110 49 64 117 52 67 118 50 65 118 50 65 118 49 64 117 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 49 65 117 49 65 117 48 65 116 48 65 116 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 48 64 117 48 64 117 48 64 116 -+48 64 117 48 64 117 44 61 114 35 51 108 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+26 43 101 36 52 108 46 61 115 45 60 114 45 60 114 44 59 113 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 44 60 114 45 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 44 59 113 36 52 108 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 31 47 105 -+40 56 111 40 56 111 39 55 111 40 56 111 39 55 111 38 54 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 38 54 110 -+39 55 111 37 53 109 26 43 102 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 30 46 104 35 51 108 35 51 108 35 51 108 -+35 51 108 35 51 108 34 50 107 35 51 108 34 50 107 33 49 106 -+27 44 102 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 25 42 101 29 45 103 29 45 103 30 46 104 29 46 104 -+30 46 104 28 45 103 25 42 101 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 24 41 100 24 41 100 -+23 40 100 24 41 100 26 43 102 28 45 103 29 47 104 32 48 105 -+34 50 107 36 52 108 38 56 110 42 58 112 46 61 115 48 64 116 -+51 66 119 53 68 119 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 69 121 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 53 68 119 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 -+54 69 120 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 52 67 118 50 65 118 47 63 116 44 59 113 40 57 112 -+38 54 110 35 52 107 33 49 106 31 47 105 29 46 104 27 44 102 -+25 42 101 24 41 100 23 40 100 24 41 100 24 41 100 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 24 41 100 33 49 106 42 58 112 48 64 117 -+51 66 119 50 65 118 50 65 118 49 64 117 49 64 117 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 50 65 118 -+49 65 117 49 65 117 48 65 116 48 65 116 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 48 64 117 49 65 117 49 65 117 48 64 116 48 64 117 -+48 64 117 38 54 110 28 45 103 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 27 44 102 -+39 55 111 46 61 115 45 60 114 45 60 114 44 59 113 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 44 60 114 44 60 114 43 60 114 44 60 114 -+44 60 114 43 59 113 43 60 114 44 60 114 34 50 107 25 42 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 32 48 105 39 55 111 -+40 56 111 39 55 110 40 56 111 39 55 111 38 54 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+38 54 110 28 45 103 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 28 45 103 35 52 107 35 51 108 34 50 107 35 51 108 -+35 51 108 34 50 107 35 51 108 34 50 107 34 50 106 29 46 104 -+24 41 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 101 27 44 102 30 46 104 29 46 104 30 46 104 30 46 104 -+29 46 104 25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 -+24 41 100 24 41 101 25 42 101 25 42 101 26 43 101 26 43 102 -+26 43 102 27 43 102 27 44 103 31 47 105 34 50 106 36 52 108 -+39 55 110 40 57 112 44 59 113 47 63 116 48 64 116 50 65 118 -+52 67 118 54 69 120 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 70 121 55 69 121 55 69 121 54 69 120 54 69 120 -+54 69 120 54 69 120 54 69 120 54 69 120 54 69 120 55 69 121 -+55 69 121 55 70 121 55 70 121 55 70 121 55 70 121 55 70 121 -+55 70 121 55 68 119 52 67 118 49 65 117 47 63 116 44 61 114 -+43 59 113 40 56 111 38 54 110 35 52 107 32 50 106 29 46 104 -+27 44 102 26 43 102 26 43 102 26 43 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 33 49 106 47 63 116 50 65 118 51 66 119 50 65 118 -+50 65 118 49 64 117 49 64 117 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 49 65 117 50 65 118 50 65 118 49 65 117 -+49 65 117 48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 48 64 117 48 64 116 48 64 117 44 60 114 -+29 46 104 25 42 101 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 28 45 104 43 58 114 -+46 61 115 46 61 115 44 59 113 44 59 113 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+44 60 114 45 60 114 43 60 114 43 60 114 44 60 114 44 60 114 -+43 59 113 44 60 114 44 60 114 31 47 105 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 31 47 105 39 55 110 40 56 111 -+39 55 110 39 55 111 40 56 111 38 54 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 38 54 110 39 55 111 -+28 45 104 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+26 43 102 34 50 107 35 51 108 34 50 107 35 51 108 35 51 108 -+35 51 108 35 51 108 34 50 107 34 50 107 32 48 105 25 42 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+25 42 101 29 46 104 30 46 104 30 46 104 29 45 103 30 46 104 -+26 43 102 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 24 41 100 24 41 100 -+24 41 100 24 41 100 24 41 100 24 41 100 23 40 100 23 40 100 -+23 40 100 23 40 100 24 41 100 25 42 101 26 43 102 27 44 103 -+29 46 103 30 46 104 29 47 104 31 47 105 31 47 105 32 48 105 -+32 48 105 32 48 105 32 48 105 32 48 105 32 48 105 30 48 104 -+29 47 104 29 46 103 28 45 103 27 44 102 25 42 102 24 41 101 -+23 40 100 23 40 100 23 40 100 23 40 100 23 40 100 24 41 100 -+24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 25 42 101 25 42 101 34 50 108 -+48 63 117 52 67 118 51 66 119 50 65 118 49 64 117 49 64 117 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 -+50 65 118 50 65 118 49 65 117 49 65 117 48 65 116 48 65 116 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 48 64 117 49 65 117 49 65 117 -+48 64 117 48 63 117 48 63 117 47 63 116 37 53 109 24 41 100 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 100 24 41 100 25 42 101 31 47 105 46 61 115 46 61 115 -+45 60 114 44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 44 60 114 45 60 114 44 60 114 -+44 60 114 43 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 43 58 114 31 47 105 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 101 25 42 100 29 46 103 39 55 110 40 56 111 39 55 111 -+40 56 111 40 56 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 38 54 110 39 55 111 39 55 111 29 46 104 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 -+34 50 107 34 50 107 35 51 108 35 51 108 35 51 108 34 50 107 -+35 51 108 35 51 108 34 50 107 33 49 106 26 43 101 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 -+29 45 103 30 46 104 29 46 104 30 46 104 30 46 104 27 44 103 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 24 41 100 24 41 100 -+24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 -+24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 -+24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+24 41 100 25 42 101 31 47 105 38 54 109 48 63 117 52 67 118 -+50 65 118 50 65 118 50 65 118 49 64 117 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+49 65 117 49 65 117 48 65 116 48 65 116 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 48 64 116 -+48 64 117 47 63 116 40 56 111 29 45 103 23 40 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 26 43 101 36 52 108 47 63 116 46 61 115 45 60 114 -+44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 44 60 114 -+43 60 114 44 60 114 44 60 114 44 60 114 43 59 113 44 60 114 -+40 57 112 29 46 104 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 29 45 103 39 55 110 40 56 111 39 55 110 40 56 111 -+39 55 111 39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 -+39 55 111 38 54 110 39 55 111 38 54 111 31 47 105 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 31 47 105 -+34 50 108 35 51 108 35 51 108 35 51 108 35 51 108 35 51 108 -+34 50 107 34 50 107 33 49 106 27 44 103 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 27 44 102 -+30 46 104 29 45 103 30 46 104 30 46 104 29 45 103 25 42 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 23 40 100 26 43 102 -+36 52 108 43 60 114 49 64 117 51 66 119 50 65 118 50 65 118 -+49 64 117 49 64 117 49 64 117 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 49 65 117 50 65 118 49 65 117 49 65 117 -+49 65 117 48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+48 64 117 49 65 117 48 64 117 48 64 116 48 64 117 49 65 117 -+42 58 112 31 47 105 25 42 101 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+27 44 103 40 56 111 46 61 115 46 61 115 45 60 114 44 59 113 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 44 60 114 45 60 114 44 60 114 43 60 114 -+44 60 114 44 60 114 44 60 114 43 59 113 44 60 114 40 56 111 -+28 45 103 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+29 46 104 39 55 110 40 56 111 39 55 110 39 55 111 40 56 111 -+39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 38 56 110 32 50 106 24 41 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 29 46 104 34 50 108 -+35 51 108 35 51 108 35 51 108 35 51 108 34 50 107 35 51 108 -+34 50 107 34 50 107 29 46 104 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 26 43 101 29 46 104 -+29 45 103 30 46 104 29 46 104 30 46 104 27 43 102 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 23 40 100 27 44 102 40 57 112 49 64 117 -+50 65 118 51 66 119 50 65 118 50 65 118 50 65 118 49 64 117 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+49 65 117 50 65 118 50 65 118 49 65 117 49 65 117 48 65 116 -+48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 -+49 65 117 48 64 117 48 64 117 48 64 117 47 63 116 32 48 107 -+25 42 101 24 41 100 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 30 46 104 -+44 59 113 46 61 115 46 61 115 45 60 114 44 59 113 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 44 60 114 45 60 114 44 60 114 43 60 114 44 60 114 -+44 60 114 44 60 114 43 59 113 44 60 114 37 53 109 25 42 101 -+24 41 100 24 41 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 29 45 103 -+38 54 110 40 56 111 39 55 110 39 55 111 40 56 111 39 55 111 -+38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+38 54 110 39 55 111 34 50 107 25 42 101 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 26 43 102 35 51 108 35 51 108 -+34 50 107 35 51 108 35 51 108 35 51 108 35 51 108 34 50 107 -+34 50 107 31 47 105 25 42 101 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 25 42 101 29 45 103 30 46 104 -+29 46 104 30 46 104 30 46 104 27 44 103 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 24 41 100 25 42 101 -+26 43 102 32 48 105 44 60 114 51 66 119 51 66 119 50 65 118 -+50 65 118 49 64 117 49 64 117 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 49 65 117 50 65 118 50 65 118 -+49 65 117 49 65 117 48 65 116 48 65 116 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 48 64 117 49 65 117 48 64 117 48 64 116 -+48 64 117 48 64 117 47 63 116 39 55 110 25 42 101 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 25 42 101 35 52 107 46 61 115 -+46 61 115 45 60 114 44 59 113 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+43 59 113 44 60 114 44 60 114 37 53 109 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 27 44 102 38 54 109 -+40 56 111 39 55 111 40 56 111 40 56 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 38 54 110 39 55 111 -+39 55 111 35 51 108 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 25 42 101 34 50 107 35 51 108 35 51 108 -+35 51 108 35 51 108 34 50 107 35 51 108 34 50 107 33 49 106 -+32 48 107 26 43 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 27 44 102 29 46 104 30 46 104 -+29 46 104 30 46 104 30 46 104 25 42 101 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 24 41 100 26 43 102 31 47 105 38 54 110 -+47 63 116 52 67 118 51 66 119 50 65 118 50 65 118 49 64 117 -+49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 49 65 117 50 65 118 50 65 118 49 65 117 49 65 117 -+48 65 116 48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+48 64 117 49 65 117 49 65 117 48 64 117 48 64 117 48 64 117 -+47 63 116 40 56 111 29 46 104 23 40 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 27 44 102 38 54 110 46 61 115 46 61 115 -+45 60 114 44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 45 60 114 -+44 60 114 43 60 114 43 60 114 44 60 114 44 60 114 43 59 113 -+44 60 114 43 59 113 34 50 107 25 42 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 27 44 103 38 54 109 40 56 111 -+39 55 110 40 56 111 39 55 111 39 55 111 38 54 111 39 55 111 -+39 55 111 39 55 111 39 55 111 38 54 110 39 55 111 39 55 111 -+34 50 108 25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 25 42 101 33 49 106 35 51 108 34 50 107 35 51 108 -+35 51 108 34 50 107 35 51 108 34 50 107 34 50 107 33 49 106 -+27 44 103 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 101 26 43 101 29 45 103 30 46 104 30 46 104 -+30 46 104 30 46 104 26 43 102 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 23 40 100 -+23 40 100 31 47 105 38 56 110 44 60 115 50 65 118 51 66 119 -+51 66 119 50 65 118 50 65 118 49 64 117 49 64 117 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 -+50 65 118 50 65 118 49 65 117 49 65 117 49 65 117 48 65 116 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 -+49 65 117 48 64 117 48 64 116 48 64 117 48 64 117 40 56 111 -+31 47 105 24 41 101 24 41 100 25 42 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+23 40 100 32 48 105 42 58 112 46 61 115 45 60 114 45 60 114 -+44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 44 60 114 45 60 114 44 60 114 -+43 60 114 44 60 114 44 60 114 44 60 114 43 59 113 44 60 114 -+42 58 112 31 47 105 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 28 45 103 38 54 109 40 56 111 39 55 110 -+39 55 111 40 56 111 39 55 111 38 54 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 34 50 108 -+26 43 101 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+25 42 101 31 47 105 35 52 107 34 50 107 35 51 108 35 51 108 -+35 51 108 35 51 108 34 50 107 34 50 107 34 50 107 28 45 103 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 29 45 103 30 46 104 29 45 103 29 45 103 -+30 46 104 27 44 103 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 100 24 41 100 24 41 100 25 42 101 37 53 109 -+47 63 116 49 64 117 50 65 118 51 66 119 50 65 118 50 65 118 -+50 65 118 49 64 117 49 64 117 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+49 65 117 49 65 117 48 65 116 48 65 116 48 65 116 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 48 64 117 49 65 117 49 65 117 -+48 64 116 48 64 117 48 64 117 44 60 114 29 46 104 25 42 101 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 25 42 100 -+37 53 109 45 60 114 46 61 115 45 60 114 44 59 113 44 59 113 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 44 60 114 45 60 114 45 60 114 44 60 114 43 60 114 -+44 60 114 44 60 114 44 60 114 44 59 113 44 60 114 40 57 112 -+27 44 103 24 41 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 28 45 103 38 54 110 40 56 111 39 55 110 39 55 111 -+40 56 111 39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 38 54 111 36 52 108 26 43 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 100 -+29 46 104 35 51 108 35 51 108 35 51 108 35 51 108 35 51 108 -+35 51 108 35 51 108 34 50 107 34 50 107 30 46 104 24 41 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 27 44 103 30 46 104 29 45 103 30 46 104 30 46 104 -+29 45 103 25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+29 46 104 26 43 101 25 42 101 24 41 100 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 24 41 100 24 41 100 -+25 42 101 26 43 102 33 49 106 44 59 113 51 66 119 51 66 119 -+50 65 118 50 65 118 49 64 117 49 64 117 49 64 117 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 49 65 117 49 65 117 48 65 116 -+48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+48 64 117 49 65 117 48 64 117 48 64 116 48 64 117 48 64 117 -+47 63 116 44 61 114 33 49 106 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 101 27 44 102 39 55 111 -+46 61 115 45 60 114 45 60 114 44 59 113 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+44 60 114 45 60 114 44 60 114 43 60 114 43 60 114 44 60 114 -+44 60 114 43 59 113 44 60 114 43 59 113 39 55 111 26 43 102 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+27 44 102 38 54 109 40 56 111 39 55 111 40 56 111 40 56 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 38 54 110 39 55 111 38 54 110 25 42 102 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 101 24 41 100 26 43 102 -+34 50 108 35 52 107 35 51 108 35 51 108 35 51 108 34 50 107 -+35 51 108 34 50 107 34 50 106 31 47 105 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 101 24 41 100 -+26 43 102 30 46 104 29 46 104 30 46 104 29 45 103 29 46 104 -+27 43 102 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+53 67 120 46 61 115 38 54 110 32 48 105 28 45 103 24 41 100 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 24 41 100 25 42 101 30 46 104 34 50 107 -+42 58 112 49 64 117 53 67 120 51 66 119 50 65 118 50 65 118 -+49 64 117 49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 50 65 118 -+49 65 117 49 65 117 49 65 117 48 65 116 48 65 116 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 49 65 117 -+49 65 117 48 64 117 48 64 117 48 64 117 48 64 117 43 59 113 -+35 51 108 25 42 101 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 25 42 101 31 47 105 44 59 113 46 61 115 -+45 60 114 44 59 113 44 59 113 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 -+45 60 114 44 60 114 43 60 114 44 60 114 44 60 114 44 60 114 -+43 59 113 44 60 114 43 59 113 37 53 109 25 42 101 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 27 44 103 -+38 54 109 40 56 111 39 55 110 40 56 111 39 55 111 39 55 111 -+38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+38 54 110 39 55 111 37 53 109 26 43 102 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 27 43 102 34 50 107 -+35 51 108 34 50 108 35 51 108 35 51 108 34 50 107 35 51 108 -+34 50 107 33 49 106 32 50 106 26 43 102 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 25 43 102 -+29 46 104 29 45 103 30 46 104 29 45 103 30 46 104 28 45 103 -+25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+50 65 118 50 65 118 52 67 118 50 65 118 47 63 116 42 57 112 -+35 51 108 28 45 103 23 40 99 23 40 100 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 23 40 99 -+24 41 101 31 47 105 38 54 110 44 60 114 48 63 117 51 66 119 -+51 66 119 50 65 118 50 65 118 49 64 117 49 64 117 49 64 117 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 -+49 65 117 48 65 116 48 65 116 48 65 116 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 48 64 117 49 65 117 48 64 117 -+48 64 116 48 64 117 48 64 117 44 60 114 34 50 107 27 44 102 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 27 43 102 38 54 109 44 61 114 46 61 115 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 44 60 114 45 60 114 45 60 114 -+44 60 114 43 60 114 44 60 114 44 60 114 44 60 114 43 59 113 -+44 60 114 43 59 113 32 48 105 25 42 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 29 45 103 38 54 109 -+40 56 111 39 55 110 39 55 111 40 56 111 39 55 111 38 54 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 38 54 110 -+39 55 111 36 52 108 27 44 102 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 26 43 101 33 49 106 35 51 108 -+34 50 107 35 51 108 35 51 108 34 50 107 35 51 108 34 50 107 -+33 49 106 34 50 107 27 44 103 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 28 45 103 -+30 46 104 30 46 104 30 46 104 30 46 104 29 45 103 25 42 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+49 64 117 50 65 118 50 65 118 50 65 118 51 66 119 51 66 119 -+50 65 118 49 64 117 46 61 115 36 52 108 27 44 102 24 41 100 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 24 41 100 24 41 101 31 47 105 40 57 112 -+48 63 117 49 64 117 50 65 118 51 66 119 50 65 118 50 65 118 -+50 65 118 49 64 117 49 64 117 49 64 117 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+49 65 117 50 65 118 49 65 117 49 65 117 49 65 117 48 65 116 -+48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 48 64 117 49 65 117 49 65 117 48 64 116 48 64 117 -+48 64 117 46 61 115 33 49 106 25 42 101 24 41 101 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+29 46 104 43 58 114 46 61 115 46 61 115 45 60 114 45 60 114 -+44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 43 59 113 44 60 114 -+42 58 112 28 45 103 25 42 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 29 45 103 38 54 110 40 56 111 -+39 55 110 39 55 111 40 56 111 39 55 111 38 54 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+37 53 109 27 44 102 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 25 42 101 32 48 107 35 51 108 34 50 107 -+35 51 108 35 51 108 35 51 108 35 51 108 34 50 107 33 49 106 -+34 50 107 29 45 103 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 26 43 102 30 46 104 -+30 46 104 30 46 104 29 45 103 30 46 104 26 43 101 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+50 65 118 50 65 118 50 65 118 50 65 118 49 64 117 49 64 117 -+50 65 118 50 65 118 51 66 119 51 66 119 53 67 120 47 63 116 -+38 54 110 29 46 104 26 43 101 25 42 101 25 42 101 24 41 100 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 24 41 100 24 41 100 25 42 101 26 43 101 -+27 44 102 32 50 106 42 57 112 50 65 118 51 66 119 51 66 119 -+50 65 118 50 65 118 49 64 117 49 64 117 49 64 117 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 49 65 117 50 65 118 49 65 117 49 65 117 -+49 65 117 48 65 116 48 65 116 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 49 65 117 -+48 64 117 48 64 116 48 64 117 48 64 117 47 63 116 46 61 115 -+34 50 108 24 41 100 24 41 100 24 41 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 25 42 101 35 52 107 -+46 61 115 46 61 115 45 60 114 44 59 113 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+44 60 114 45 60 114 45 60 114 44 60 114 43 60 114 44 60 114 -+44 60 114 44 60 114 43 59 113 44 60 114 43 59 113 40 56 111 -+26 43 102 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 25 42 100 28 45 103 38 56 110 40 56 111 39 55 111 -+40 56 111 40 56 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 38 54 110 39 55 111 38 54 110 -+27 44 103 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 25 42 101 29 46 104 35 51 108 34 50 107 35 51 108 -+35 51 108 35 51 108 34 50 107 35 51 108 34 50 107 34 50 107 -+31 47 105 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 25 42 101 29 46 104 29 45 103 -+30 46 104 30 46 104 30 46 104 27 44 102 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+49 64 117 49 64 117 49 64 117 50 65 118 50 65 118 51 66 119 -+52 67 118 53 67 120 48 63 117 40 57 112 35 51 108 31 47 105 -+27 44 103 24 41 101 24 41 100 24 41 100 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 24 41 100 -+24 41 100 26 43 102 29 46 104 32 50 106 37 53 109 44 60 114 -+50 65 118 53 67 120 51 66 119 50 65 118 50 65 118 50 65 118 -+49 64 117 49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 49 65 117 49 65 117 48 65 116 -+48 65 116 48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 48 64 117 49 65 117 49 65 117 48 64 117 -+48 64 117 48 64 117 47 63 116 42 58 112 34 50 108 25 42 101 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 29 46 104 40 56 111 46 61 115 -+45 60 114 45 60 114 44 59 113 44 59 113 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 -+45 60 114 44 60 114 44 60 114 43 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 43 59 113 36 52 108 25 42 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 29 46 103 39 55 110 40 56 111 39 55 110 40 56 111 -+39 55 111 39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 38 54 110 39 55 111 37 53 109 27 44 103 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 29 45 103 35 51 108 35 52 107 35 51 108 35 51 108 -+35 51 108 34 50 107 35 51 108 34 50 107 34 50 106 31 47 105 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 101 29 45 103 30 46 104 29 46 104 -+30 46 104 29 46 104 28 45 103 25 42 101 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 49 64 117 49 64 117 49 64 117 49 64 117 -+50 65 118 50 65 118 51 66 119 51 66 119 51 66 119 49 64 117 -+46 61 115 43 58 114 38 54 110 32 48 107 26 43 102 23 40 99 -+23 40 100 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 23 40 100 23 40 100 29 46 103 34 50 107 -+40 57 112 44 60 114 47 63 116 51 66 119 51 66 119 51 66 119 -+50 65 118 50 65 118 50 65 118 49 64 117 49 64 117 49 64 117 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 49 65 117 50 65 118 50 65 118 -+49 65 117 49 65 117 49 65 117 48 65 116 48 65 116 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+48 64 117 49 65 117 49 65 117 48 64 117 48 64 116 48 64 117 -+48 64 117 40 57 112 32 48 105 26 43 102 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 25 42 100 35 51 108 44 59 113 46 61 115 45 60 114 -+45 60 114 44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+44 60 114 44 60 114 43 60 114 44 60 114 44 60 114 44 60 114 -+43 59 113 44 60 114 42 58 112 31 47 105 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+31 47 105 39 55 110 40 56 111 39 55 110 39 55 111 40 56 111 -+39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 38 54 110 39 55 111 37 53 109 27 44 103 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+28 45 103 35 52 107 35 51 108 34 50 108 35 51 108 35 51 108 -+34 50 107 35 51 108 34 50 107 33 49 106 33 49 106 26 43 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 101 25 42 100 27 44 102 30 46 104 29 45 103 30 46 104 -+29 45 103 30 46 104 26 43 102 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+49 64 117 49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 -+51 66 119 51 66 119 50 65 118 50 65 118 49 64 117 46 61 115 -+38 54 110 31 47 105 25 42 100 24 41 100 24 41 100 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 24 41 100 23 40 100 -+27 43 102 34 50 107 42 57 112 48 63 117 49 64 117 50 65 118 -+51 66 119 51 66 119 50 65 118 50 65 118 50 65 118 50 65 118 -+49 64 117 49 64 117 49 64 117 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 49 65 117 -+49 65 117 48 65 116 48 65 116 48 65 116 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 49 65 117 -+49 65 117 48 64 117 48 64 117 48 64 117 48 64 117 40 57 112 -+28 45 103 25 42 101 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 101 24 41 100 -+28 45 103 42 58 112 45 60 114 46 61 115 45 60 114 44 59 113 -+44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 44 60 114 45 60 114 45 60 114 -+43 60 114 43 60 114 44 60 114 44 60 114 44 60 114 43 59 113 -+44 60 114 40 57 112 26 43 102 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 31 47 105 -+39 55 110 40 56 111 39 55 110 39 55 111 40 56 111 39 55 111 -+38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 37 53 109 27 44 103 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 27 44 102 -+34 50 107 35 51 108 34 50 107 35 51 108 35 51 108 34 50 107 -+35 51 108 34 50 107 33 49 106 34 50 107 27 44 102 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 27 44 102 29 46 104 29 45 103 30 46 104 29 46 104 -+30 46 104 27 44 103 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 49 64 117 -+49 64 117 49 64 117 50 65 118 50 65 118 50 65 118 51 66 119 -+51 66 119 51 66 119 51 66 119 46 61 115 38 54 110 32 48 107 -+27 44 102 26 43 101 25 42 101 25 42 101 24 41 100 24 41 100 -+24 41 100 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 24 41 100 24 41 100 24 41 101 25 42 101 -+25 42 101 26 43 102 28 45 103 35 52 107 42 57 112 49 64 117 -+52 67 118 51 66 119 51 66 119 50 65 118 50 65 118 50 65 118 -+49 64 117 49 64 117 49 64 117 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 49 65 117 50 65 118 50 65 118 -+49 65 117 49 65 117 49 65 117 48 65 116 48 65 116 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+48 64 117 49 65 117 49 65 117 49 65 117 48 64 116 48 64 117 -+48 64 117 47 63 116 47 63 116 40 56 111 27 44 102 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 25 42 101 34 50 107 -+45 60 114 46 61 115 45 60 114 44 59 113 44 59 113 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 43 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+36 52 108 25 42 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 25 42 101 29 47 104 39 55 111 -+40 56 111 39 55 111 40 56 111 40 56 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 38 54 110 -+39 55 111 38 54 110 27 44 103 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 26 43 102 33 49 106 -+35 51 108 35 51 108 35 51 108 35 51 108 35 51 108 35 51 108 -+34 50 107 33 49 106 34 50 107 28 45 103 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+25 42 101 29 45 103 30 46 104 30 46 104 29 45 103 30 46 104 -+29 46 104 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+50 65 118 50 65 118 49 65 117 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 49 64 117 49 64 117 49 64 117 49 64 117 -+50 65 118 50 65 118 50 65 118 51 66 119 51 66 119 53 67 120 -+51 66 119 47 63 116 42 57 112 37 53 109 34 50 106 31 47 105 -+28 45 103 26 43 101 24 41 100 24 41 100 24 41 100 24 41 100 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 24 41 100 24 41 100 23 40 100 -+24 41 100 27 44 102 29 46 104 31 47 105 35 51 108 39 55 111 -+44 60 114 48 63 117 53 67 120 52 67 118 51 66 119 50 65 118 -+50 65 118 50 65 118 50 65 118 49 64 117 49 64 117 49 64 117 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+49 65 117 50 65 118 50 65 118 50 65 118 49 65 117 49 65 117 -+49 65 117 48 65 116 48 65 116 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 -+49 65 117 48 64 117 48 64 116 48 64 117 48 64 117 47 63 116 -+43 59 113 37 53 109 28 45 103 23 40 100 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 29 46 104 39 55 110 47 63 116 -+45 60 114 45 60 114 44 59 113 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+44 60 114 45 60 114 44 60 114 44 60 114 43 60 114 44 60 114 -+44 60 114 44 60 114 43 59 113 44 60 114 42 58 112 33 49 106 -+24 41 100 24 41 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 25 42 101 32 48 105 40 56 111 40 56 111 -+39 55 110 40 56 111 39 55 111 39 55 111 38 54 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 38 54 110 39 55 111 -+37 53 109 27 44 103 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 25 42 101 32 48 107 35 51 108 -+34 50 107 35 51 108 35 51 108 35 51 108 34 50 107 35 51 108 -+34 50 107 34 50 107 29 46 104 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+27 44 103 30 46 104 29 45 103 29 45 103 30 46 104 29 45 103 -+25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+49 65 117 49 65 117 50 65 118 50 65 118 49 65 117 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+49 64 117 49 64 117 49 64 117 49 64 117 50 65 118 50 65 118 -+50 65 118 51 66 119 51 66 119 51 66 119 51 66 119 49 64 117 -+47 63 116 44 60 114 42 57 112 38 54 110 34 50 107 29 47 104 -+26 43 101 23 40 99 23 40 99 23 40 100 24 41 100 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 24 41 100 24 41 100 23 40 100 -+23 40 99 24 41 100 27 44 102 31 47 105 36 52 108 40 56 111 -+43 58 114 44 60 115 47 63 116 50 65 118 52 67 118 51 66 119 -+51 66 119 50 65 118 50 65 118 50 65 118 50 65 118 49 64 117 -+49 64 117 49 64 117 49 64 117 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 49 65 117 50 65 118 50 65 118 -+50 65 118 49 65 117 49 65 117 49 65 117 48 65 116 48 65 116 -+48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 48 64 117 49 65 117 49 65 117 49 65 117 -+48 64 116 48 64 117 48 64 117 48 64 117 40 56 111 32 50 106 -+27 43 102 24 41 100 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 26 43 101 36 52 108 44 60 114 46 61 115 45 60 114 -+45 60 114 44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 -+45 60 114 44 60 114 43 60 114 43 60 114 44 60 114 44 60 114 -+43 59 113 43 60 114 44 61 114 39 55 110 29 45 103 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 25 42 101 34 50 107 40 56 111 40 56 111 39 55 110 -+39 55 111 40 56 111 39 55 111 38 54 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 38 54 110 39 55 111 37 53 109 -+27 44 102 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 25 42 100 32 48 107 35 51 108 34 50 107 -+35 51 108 35 51 108 35 51 108 34 50 107 35 51 108 34 50 107 -+34 50 106 29 47 104 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 27 44 103 -+30 46 104 29 45 103 30 46 104 30 46 104 29 45 103 26 43 102 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+48 65 116 49 65 117 49 65 117 49 65 117 50 65 118 50 65 118 -+50 65 118 49 65 117 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 49 64 117 49 64 117 -+49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 51 66 119 -+51 66 119 51 66 119 51 66 119 50 65 118 50 65 118 49 64 117 -+49 64 117 48 63 117 43 59 113 38 54 110 34 50 107 29 46 104 -+25 42 101 23 40 100 24 41 100 24 41 100 24 41 100 24 41 100 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 -+23 40 100 23 40 100 27 43 102 32 48 105 36 52 108 40 57 112 -+45 60 114 48 64 117 49 64 117 50 65 118 50 65 118 51 66 119 -+51 66 119 51 66 119 51 66 119 50 65 118 50 65 118 50 65 118 -+50 65 118 49 64 117 49 64 117 49 64 117 49 64 117 49 64 117 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 49 65 117 50 65 118 50 65 118 49 65 117 49 65 117 -+49 65 117 49 65 117 48 65 116 48 65 116 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 48 64 117 49 65 117 48 64 117 48 64 116 48 64 117 -+48 64 117 47 63 116 38 54 109 27 44 103 25 42 101 24 41 100 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+29 47 104 43 58 114 45 60 114 46 61 115 45 60 114 45 60 114 -+44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+44 60 114 43 60 114 44 60 114 44 60 114 44 60 114 43 59 113 -+44 60 114 44 60 114 35 52 107 25 42 101 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+25 42 101 35 52 107 40 56 111 40 56 111 39 55 110 40 56 111 -+40 56 111 39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 37 53 109 26 44 102 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 101 32 48 105 34 50 108 35 52 107 35 51 108 -+35 51 108 35 51 108 34 50 107 35 51 108 34 50 107 34 50 107 -+31 47 105 25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 26 43 102 29 46 104 -+30 46 104 30 46 104 30 46 104 29 46 104 27 44 103 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+49 65 117 49 65 117 49 65 117 49 65 117 48 65 116 48 65 116 -+49 65 117 49 65 117 49 65 117 50 65 118 50 65 118 50 65 118 -+49 65 117 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 49 64 117 -+49 64 117 49 64 117 49 64 117 49 64 117 50 65 118 50 65 118 -+50 65 118 50 65 118 51 66 119 51 66 119 51 66 119 51 66 119 -+52 67 118 49 64 117 44 60 115 40 57 112 37 53 109 33 49 106 -+30 46 104 27 44 102 26 43 102 26 43 102 26 43 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 24 41 100 -+24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 -+24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 24 41 100 24 41 100 -+24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 -+24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 25 42 100 -+25 42 101 25 42 101 25 42 101 25 42 101 26 43 101 26 43 102 -+26 43 102 27 44 103 31 47 105 35 51 108 38 54 110 43 58 114 -+47 63 116 51 66 119 52 67 118 51 66 119 51 66 119 51 66 119 -+51 66 119 50 65 118 50 65 118 50 65 118 50 65 118 49 64 117 -+49 64 117 49 64 117 49 64 117 49 64 117 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 49 65 117 50 65 118 50 65 118 50 65 118 49 65 117 -+49 65 117 49 65 117 48 65 116 48 65 116 48 65 116 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 48 64 117 49 65 117 49 65 117 48 64 117 -+48 64 116 48 64 117 48 63 117 48 63 117 47 63 116 44 61 114 -+35 51 108 25 42 101 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 25 42 100 26 43 102 37 53 109 -+47 63 116 46 61 115 45 60 114 44 59 113 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 44 60 114 45 60 114 45 60 114 44 60 114 43 60 114 -+43 60 114 44 60 114 44 60 114 43 59 113 44 60 114 44 60 114 -+42 58 112 31 47 105 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 -+35 51 108 40 56 111 39 55 110 40 56 111 40 56 111 39 55 111 -+38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+38 54 110 39 55 111 39 55 111 38 54 110 26 43 102 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+25 42 100 30 46 104 34 50 108 34 50 107 35 51 108 35 51 108 -+35 51 108 35 51 108 35 51 108 34 50 107 34 50 107 33 49 106 -+25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 25 42 101 29 46 104 29 45 103 -+30 46 104 29 45 103 30 46 104 29 45 103 25 42 101 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+48 65 116 48 65 116 48 65 116 49 65 117 49 65 117 49 65 117 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 49 64 117 49 64 117 -+49 64 117 49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 51 66 119 51 66 119 52 67 118 52 67 118 -+53 67 120 53 67 120 50 65 118 47 63 116 44 60 115 42 58 112 -+40 57 112 38 54 110 36 52 108 34 50 107 33 49 106 32 48 105 -+31 47 105 29 47 104 29 46 104 29 45 103 27 44 103 27 44 102 -+26 43 102 26 43 101 25 42 101 25 42 101 25 42 100 24 41 100 -+24 41 100 23 40 100 23 40 100 23 40 100 23 40 100 23 40 100 -+23 40 100 23 40 100 23 40 100 23 40 100 23 40 100 23 40 100 -+23 40 100 23 40 100 24 41 100 24 41 100 25 42 100 25 42 101 -+25 42 101 26 43 101 27 43 102 27 44 102 28 45 103 29 45 103 -+29 46 104 29 47 104 31 47 105 32 50 106 33 49 106 35 52 107 -+37 53 109 39 55 110 40 57 112 44 60 114 46 61 115 48 63 117 -+50 65 118 53 67 120 53 67 120 52 67 118 51 66 119 51 66 119 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+49 64 117 49 64 117 49 64 117 49 64 117 49 64 117 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 50 65 118 -+50 65 118 50 65 118 49 65 117 49 65 117 49 65 117 49 65 117 -+48 65 116 48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+48 64 117 49 65 117 49 65 117 48 64 117 48 64 116 48 64 117 -+48 64 117 48 64 117 44 60 114 39 55 111 31 47 105 24 41 100 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 101 24 41 100 25 42 101 32 50 106 43 59 113 46 61 115 -+45 60 114 45 60 114 44 59 113 44 59 113 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+44 60 114 45 60 114 44 60 114 44 60 114 43 60 114 44 60 114 -+44 60 114 44 60 114 43 59 113 44 60 114 44 60 114 38 56 110 -+27 44 103 24 41 100 24 41 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 27 44 102 36 52 108 -+40 56 111 39 55 110 39 55 111 40 56 111 39 55 111 38 54 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 38 54 110 -+39 55 111 39 55 111 36 52 108 26 43 102 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+28 45 103 34 50 107 35 51 108 35 51 108 35 51 108 35 51 108 -+35 51 108 34 50 107 34 50 107 34 50 107 33 49 106 27 43 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 25 42 101 27 44 103 29 46 103 30 46 104 -+29 46 104 30 46 104 29 45 103 25 43 102 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 48 65 116 48 65 116 48 65 116 48 65 116 -+49 65 117 49 65 117 49 65 117 50 65 118 50 65 118 50 65 118 -+50 65 118 49 65 117 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 49 64 117 49 64 117 49 64 117 49 64 117 -+49 64 117 49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 51 66 119 51 66 119 51 66 119 -+51 66 119 51 66 119 51 66 119 52 67 118 51 66 119 50 65 118 -+49 64 117 48 63 117 47 63 116 47 63 116 46 61 115 44 60 115 -+44 60 115 44 60 114 44 60 114 43 58 114 43 58 114 42 58 112 -+42 58 112 42 57 112 40 57 112 40 56 111 40 57 112 40 57 112 -+40 57 112 40 57 112 40 57 112 40 57 112 40 57 112 40 57 112 -+40 57 112 42 57 112 42 58 112 42 58 112 43 58 114 43 59 113 -+44 60 114 44 60 114 45 60 114 46 61 115 46 61 115 47 63 116 -+48 63 117 48 64 117 50 65 118 50 65 118 51 66 119 52 67 118 -+51 66 119 51 66 119 51 66 119 51 66 119 51 66 119 51 66 119 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+49 64 117 49 64 117 49 64 117 49 64 117 49 64 117 49 64 117 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 -+49 65 117 49 65 117 49 65 117 48 65 116 48 65 116 48 65 116 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 49 65 117 -+49 65 117 48 64 117 48 64 116 48 64 117 49 65 117 47 63 116 -+39 55 111 33 49 106 27 44 103 24 41 100 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 40 99 29 47 104 39 55 111 45 60 114 46 61 115 45 60 114 -+45 60 114 44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 -+45 60 114 44 60 114 44 60 114 43 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 43 59 113 33 49 106 25 42 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 28 45 103 37 53 109 40 56 111 -+39 55 110 39 55 111 40 56 111 39 55 111 38 54 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 35 51 108 26 43 101 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 28 45 103 -+34 50 107 35 51 108 34 50 107 35 51 108 35 51 108 35 51 108 -+34 50 107 35 51 108 33 49 106 33 49 106 27 44 102 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 27 44 102 29 46 104 30 46 104 30 46 104 -+29 45 103 29 46 104 26 43 101 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+48 65 116 48 65 116 48 65 116 49 65 117 49 65 117 49 65 117 -+49 65 117 50 65 118 50 65 118 50 65 118 49 65 117 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 49 64 117 49 64 117 49 64 117 49 64 117 -+49 64 117 49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 51 66 119 51 66 119 51 66 119 51 66 119 51 66 119 -+51 66 119 51 66 119 51 66 119 51 66 119 51 66 119 51 66 119 -+51 66 119 51 66 119 51 66 119 51 66 119 51 66 119 51 66 119 -+51 66 119 51 66 119 51 66 119 51 66 119 51 66 119 51 66 119 -+51 66 119 51 66 119 51 66 119 51 66 119 51 66 119 51 66 119 -+51 66 119 51 66 119 51 66 119 51 66 119 51 66 119 51 66 119 -+51 66 119 51 66 119 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+49 64 117 49 64 117 49 64 117 49 64 117 49 64 117 49 64 117 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 49 65 117 49 65 117 49 65 117 48 65 116 -+48 65 116 48 65 116 48 65 116 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 -+48 64 117 48 64 117 49 65 117 46 61 115 34 50 107 27 44 102 -+25 42 101 24 41 100 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 -+38 54 110 45 60 114 46 61 115 45 60 114 45 60 114 44 59 113 -+44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 45 60 114 -+44 60 114 44 60 114 43 60 114 44 60 114 44 60 114 44 60 114 -+43 59 113 44 60 114 40 57 112 28 45 103 25 42 101 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 28 45 103 39 55 110 40 56 111 39 55 110 -+39 55 111 40 56 111 39 55 111 38 54 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 38 54 110 39 55 111 -+36 52 108 25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 27 44 102 34 50 107 -+35 51 108 34 50 107 35 51 108 35 51 108 35 51 108 34 50 107 -+35 51 108 34 50 107 33 49 106 27 44 103 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 25 42 101 30 46 104 30 46 104 29 46 104 29 45 103 -+30 46 104 27 44 103 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+48 65 116 48 65 116 48 65 116 49 65 117 49 65 117 49 65 117 -+49 65 117 50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+49 64 117 49 64 117 49 64 117 49 64 117 49 64 117 49 64 117 -+49 64 117 49 64 117 49 64 117 49 64 117 49 64 117 49 64 117 -+49 64 117 49 64 117 49 64 117 49 64 117 49 64 117 49 64 117 -+49 64 117 49 64 117 49 64 117 49 64 117 49 64 117 49 64 117 -+49 64 117 49 64 117 49 64 117 49 64 117 49 64 117 49 64 117 -+49 64 117 49 64 117 49 64 117 49 64 117 49 64 117 49 64 117 -+49 64 117 49 64 117 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 49 65 117 50 65 118 50 65 118 -+50 65 118 49 65 117 49 65 117 49 65 117 49 65 117 48 65 116 -+48 65 116 48 65 116 48 65 116 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 48 64 117 49 65 117 49 65 117 -+48 64 117 48 64 116 48 64 117 48 63 117 48 64 117 47 63 116 -+46 61 115 40 57 112 29 46 104 24 41 100 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 25 42 101 31 47 105 44 59 113 -+46 61 115 45 60 114 45 60 114 44 59 113 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 44 60 114 44 60 114 43 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+43 59 113 37 53 109 25 42 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+25 42 100 29 46 103 40 56 111 40 56 111 39 55 110 40 56 111 -+40 56 111 39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 38 54 110 39 55 111 39 55 111 35 51 108 -+25 42 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 27 43 102 34 50 107 34 50 107 -+35 51 108 35 51 108 35 51 108 34 50 107 35 51 108 35 51 108 -+34 50 107 33 49 106 30 46 104 24 41 100 24 41 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 101 30 46 104 29 45 103 30 46 104 29 46 104 30 46 104 -+28 45 103 25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+49 65 117 48 64 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 48 65 116 48 65 116 48 65 116 -+48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 50 65 118 -+50 65 118 50 65 118 49 65 117 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 -+50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 49 65 117 -+49 65 117 49 65 117 48 65 116 48 65 116 48 65 116 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+48 64 117 49 65 117 49 65 117 49 65 117 48 64 116 48 64 117 -+48 64 117 48 64 117 48 64 116 44 60 114 40 56 111 34 50 107 -+26 43 102 23 40 99 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 25 42 101 30 46 104 39 55 110 46 61 115 46 61 115 -+45 60 114 44 59 113 44 59 113 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+44 60 114 45 60 114 44 60 114 44 60 114 43 60 114 43 60 114 -+44 60 114 44 60 114 43 60 114 44 60 113 44 60 114 40 56 111 -+31 47 105 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 -+32 48 105 40 56 111 39 55 111 39 55 110 39 55 111 40 56 111 -+39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 38 54 110 39 55 111 38 56 110 34 50 107 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 26 43 102 33 49 106 35 51 108 35 51 108 -+35 51 108 35 51 108 35 51 108 35 51 108 34 50 107 34 50 107 -+34 50 107 29 47 104 24 41 101 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 -+29 45 103 29 45 103 30 46 104 30 46 104 29 45 103 29 46 104 -+26 43 101 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+48 64 117 49 65 117 49 65 117 49 65 117 48 64 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+48 65 116 48 65 116 48 65 116 48 65 116 48 65 116 49 65 117 -+49 65 117 49 65 117 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 49 65 117 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+49 65 117 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 48 65 116 -+48 65 116 48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 48 64 117 49 65 117 49 65 117 -+49 65 117 48 64 117 48 64 116 48 64 117 48 64 117 49 65 117 -+44 61 114 38 54 110 32 50 106 27 44 103 24 41 100 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+27 44 103 37 53 109 44 60 114 46 61 115 45 60 114 45 60 114 -+45 60 114 44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 -+45 60 114 44 60 114 44 60 114 43 60 114 44 60 114 44 60 114 -+44 60 114 43 59 113 44 60 114 44 60 114 35 52 107 26 43 102 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 34 50 107 -+40 56 111 39 55 110 39 55 111 40 56 111 40 56 111 39 55 111 -+38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 32 48 107 25 42 101 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 25 43 102 32 48 107 35 51 108 34 50 107 35 51 108 -+35 51 108 35 51 108 34 50 107 35 51 108 34 50 107 34 50 107 -+31 47 105 25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 101 27 44 102 -+29 45 103 29 46 104 30 46 104 29 45 103 30 46 104 26 43 102 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+48 64 117 48 64 117 48 64 116 48 64 117 49 65 117 49 65 117 -+49 65 117 48 64 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 48 65 116 48 65 116 -+48 65 116 48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+49 65 117 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 48 65 116 48 65 116 48 65 116 48 65 116 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 48 64 117 49 65 117 49 65 117 48 64 117 48 64 117 -+48 64 117 48 64 117 48 64 117 47 63 116 38 54 110 29 47 104 -+26 43 101 25 42 101 24 41 100 24 41 100 24 41 100 24 41 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 100 24 41 100 25 42 100 36 52 108 -+45 60 114 45 60 114 46 61 115 45 60 114 45 60 114 44 59 113 -+44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+44 60 114 43 60 114 43 60 114 44 60 114 44 60 114 44 60 114 -+43 59 113 44 60 114 42 58 112 29 46 104 25 42 101 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 25 42 101 36 52 108 40 56 111 -+40 56 111 39 55 111 40 56 111 39 55 111 39 55 111 38 54 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+38 54 110 39 55 111 31 47 105 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 101 33 49 106 35 51 108 35 52 107 35 51 108 35 51 108 -+35 51 108 34 50 107 35 51 108 34 50 107 34 50 107 31 47 105 -+25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 26 43 102 30 46 104 -+30 46 104 30 46 104 29 45 103 30 46 104 27 44 102 24 41 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+35 51 108 43 59 113 47 63 116 47 63 116 48 64 117 48 64 117 -+48 64 117 48 64 117 48 64 117 48 64 117 49 65 117 49 65 117 -+48 64 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+48 65 116 48 65 116 48 65 116 48 65 116 48 65 116 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 49 65 117 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 48 65 116 48 65 116 48 65 116 -+48 65 116 48 65 116 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 48 64 117 49 65 117 49 65 117 49 65 117 48 64 117 -+48 64 116 48 64 117 48 63 117 48 64 117 47 63 116 47 63 116 -+46 61 115 39 55 111 31 47 105 24 41 100 24 41 100 24 41 100 -+24 41 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 25 42 101 31 47 105 44 59 113 46 61 115 -+45 60 114 45 60 114 44 59 113 44 59 113 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 44 60 114 45 60 114 44 60 114 44 60 114 43 60 114 -+43 60 114 44 60 114 44 60 114 43 59 113 44 60 114 44 60 114 -+43 59 113 37 53 109 25 42 101 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 26 43 101 38 54 110 40 56 111 39 55 110 -+39 55 111 40 56 111 39 55 111 38 54 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 38 54 111 38 54 110 39 55 111 -+38 54 110 30 46 104 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 25 42 101 -+33 49 106 35 51 108 34 50 107 35 51 108 35 51 108 35 51 108 -+35 51 108 35 51 108 34 50 107 34 50 107 32 48 107 25 42 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 25 42 101 29 46 104 29 45 103 -+30 46 104 30 46 104 30 46 104 27 44 103 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 23 40 100 27 44 102 34 50 107 40 56 111 43 59 113 -+47 63 116 48 64 117 48 64 117 48 64 117 48 64 117 48 64 116 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 48 65 116 -+48 65 116 48 65 116 48 65 116 48 65 116 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+49 65 117 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 49 65 117 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 48 65 116 48 65 116 -+48 65 116 48 65 116 48 65 116 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 49 65 117 -+49 65 117 49 65 117 48 64 117 48 64 117 48 64 117 48 64 117 -+48 64 117 48 64 117 44 61 114 42 58 112 37 53 109 31 47 105 -+24 41 100 23 40 100 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+25 42 101 30 46 104 39 55 110 46 61 115 46 61 115 45 60 114 -+45 60 114 44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 44 60 114 43 60 114 43 60 114 44 60 114 -+44 60 114 44 60 114 43 59 113 44 60 114 44 60 114 40 56 111 -+31 47 105 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 29 46 104 39 55 110 40 56 111 39 55 110 39 55 111 -+40 56 111 39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 38 54 110 -+29 46 104 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 32 48 107 -+35 51 108 34 50 107 35 51 108 35 51 108 35 51 108 34 50 107 -+35 51 108 34 50 107 34 50 107 33 49 106 26 43 101 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 25 42 101 29 45 103 30 46 104 29 46 104 -+30 46 104 30 46 104 29 45 103 25 42 101 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 24 41 100 24 41 100 27 44 102 -+29 47 104 34 50 107 40 56 111 46 61 115 49 65 117 48 64 117 -+48 64 117 48 64 116 48 64 117 49 65 117 49 65 117 49 65 117 -+49 65 117 48 64 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 48 65 116 48 65 116 -+48 65 116 48 65 116 48 65 116 48 65 116 48 65 116 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+49 65 117 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 49 65 117 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 48 65 116 48 65 116 -+48 65 116 48 65 116 48 65 116 48 65 116 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 48 64 117 49 65 117 49 65 117 49 65 117 48 64 117 -+48 64 116 48 64 117 48 64 117 49 65 117 49 65 117 43 59 113 -+37 53 109 32 48 107 28 45 103 25 42 101 24 41 100 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 29 46 104 -+39 55 110 45 60 114 46 61 115 45 60 114 45 60 114 44 59 113 -+44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 45 60 114 -+44 60 114 44 60 114 44 60 114 43 60 114 44 60 114 44 60 114 -+44 60 114 43 59 113 44 60 114 43 59 113 34 50 107 26 43 102 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+32 48 105 39 55 110 40 56 111 39 55 110 39 55 111 40 56 111 -+39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 38 54 110 39 55 111 37 53 109 28 45 103 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 31 47 105 35 51 108 -+35 51 108 35 51 108 35 51 108 35 51 108 35 51 108 35 51 108 -+34 50 107 34 50 107 33 49 106 26 43 102 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 101 28 45 104 30 46 104 29 45 103 30 46 104 -+29 45 103 30 46 104 26 43 102 24 41 101 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+24 41 100 25 42 101 25 42 101 26 43 101 29 46 104 37 53 109 -+44 60 114 49 65 117 48 64 117 48 64 117 48 64 116 48 64 117 -+48 64 117 49 65 117 49 65 117 49 65 117 48 64 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 48 65 116 48 65 116 -+48 65 116 48 65 116 48 65 116 48 65 116 48 65 116 48 65 116 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 50 65 118 -+50 65 118 50 65 118 50 65 118 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 48 65 116 48 65 116 48 65 116 -+48 65 116 48 65 116 48 65 116 48 65 116 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 48 64 117 48 64 116 48 64 117 48 64 117 -+48 64 117 47 63 116 40 57 112 33 49 106 27 44 102 26 43 101 -+25 42 101 24 41 100 24 41 100 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 101 24 41 100 26 43 102 39 55 110 45 60 114 -+46 61 115 46 61 115 45 60 114 45 60 114 44 59 113 44 59 113 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 44 60 114 45 60 114 44 60 114 -+44 60 114 43 60 114 43 60 114 44 60 114 44 60 114 44 60 114 -+43 59 113 44 60 114 40 57 112 28 45 103 25 42 101 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 35 51 108 -+39 55 110 40 56 111 39 55 110 40 56 111 40 56 111 39 55 111 -+38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 38 54 110 39 55 111 37 53 109 26 43 101 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 31 47 105 35 51 108 35 51 108 -+34 50 107 35 51 108 35 51 108 35 51 108 34 50 107 35 51 108 -+34 50 107 33 49 106 26 43 102 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 27 44 102 30 46 104 29 45 103 30 46 104 29 45 103 -+30 46 104 27 44 103 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+24 41 100 26 43 102 34 50 107 40 57 112 46 61 115 47 63 116 -+47 63 116 48 63 117 48 64 117 48 64 117 48 64 117 48 64 117 -+48 64 117 48 64 117 49 65 117 49 65 117 49 65 117 49 65 117 -+48 64 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+48 65 116 48 65 116 48 65 116 48 65 116 48 65 116 48 65 116 -+48 65 116 48 65 116 48 65 116 48 65 116 48 65 116 48 65 116 -+48 65 116 48 65 116 48 65 116 48 65 116 48 65 116 48 65 116 -+48 65 116 48 65 116 48 65 116 48 65 116 48 65 116 48 65 116 -+48 65 116 48 65 116 48 65 116 48 65 116 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+48 64 117 48 64 117 48 64 116 48 64 117 48 64 117 48 63 117 -+48 64 117 47 63 116 47 63 116 47 63 116 43 60 114 37 53 109 -+30 46 104 24 41 100 24 41 100 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+25 42 101 26 43 101 36 52 108 46 61 115 46 61 115 46 61 115 -+45 60 114 44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+44 60 114 45 60 114 44 60 114 44 60 114 44 60 114 43 60 114 -+44 60 114 44 60 114 44 60 114 43 59 113 44 60 114 43 60 114 -+43 59 113 34 50 108 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 26 43 102 37 53 109 40 56 111 -+39 55 110 39 55 111 40 56 111 39 55 111 38 54 111 38 54 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 38 54 110 -+39 55 111 39 55 111 36 52 108 25 42 101 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 31 47 105 35 51 108 34 50 107 35 51 108 -+35 51 108 35 51 108 34 50 107 35 51 108 34 50 107 33 49 106 -+33 49 106 28 45 102 25 42 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+26 43 102 29 46 104 29 45 103 30 46 104 29 45 103 30 46 104 -+29 45 103 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 24 41 100 23 40 100 24 41 100 29 46 103 -+34 50 107 39 55 111 42 58 112 46 61 115 47 63 116 48 64 117 -+48 64 117 48 64 117 48 64 117 48 64 117 48 64 117 48 64 117 -+49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 48 64 117 48 64 117 48 64 117 48 64 116 -+48 64 117 48 64 117 48 64 117 48 64 117 46 61 115 43 60 114 -+40 57 112 37 53 109 32 48 105 27 43 102 23 40 100 23 40 100 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 100 24 41 100 24 41 100 27 44 103 -+34 50 107 44 60 114 46 61 115 46 61 115 45 60 114 45 60 114 -+44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 -+45 60 114 44 60 114 44 60 114 43 60 114 43 60 114 44 60 114 -+44 60 114 44 60 114 43 59 113 44 60 114 43 59 113 38 54 110 -+28 45 103 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 28 45 103 37 53 109 40 56 111 39 55 110 -+39 55 111 40 56 111 39 55 111 38 54 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 110 34 50 107 25 42 101 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+25 42 101 29 47 104 34 50 108 34 50 107 35 51 108 35 51 108 -+35 51 108 34 50 107 35 51 108 34 50 107 34 50 107 33 49 106 -+28 45 103 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 -+29 45 103 30 46 104 29 46 104 29 45 103 30 46 104 29 45 103 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+24 41 100 24 41 100 26 43 102 29 45 103 31 47 105 34 50 107 -+39 55 111 43 59 113 48 63 117 49 65 117 48 64 117 48 64 117 -+48 64 117 48 64 117 48 64 117 48 64 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 48 64 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 48 64 117 -+48 64 117 48 64 116 48 64 117 48 64 117 49 65 117 50 65 118 -+46 61 115 40 57 112 37 53 109 32 50 106 30 46 104 27 44 102 -+24 41 101 24 41 100 24 41 100 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 27 44 102 36 52 108 42 58 112 -+46 61 115 46 61 115 45 60 114 45 60 114 44 59 113 44 59 113 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+44 60 114 43 60 114 43 60 114 44 60 114 44 60 114 44 60 114 -+43 59 113 44 60 114 44 61 114 40 57 112 31 47 105 25 42 101 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 32 48 105 38 54 110 40 56 111 38 56 110 40 56 111 -+40 56 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 38 54 110 39 55 111 39 55 111 -+31 47 105 25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+30 46 104 34 50 107 35 51 108 35 51 108 35 51 108 35 51 108 -+35 51 108 35 51 108 34 50 107 34 50 107 34 50 107 27 44 103 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 29 46 104 -+30 46 104 29 45 103 30 46 104 30 46 104 29 45 103 26 43 101 -+24 41 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 101 24 41 100 24 41 100 24 41 100 25 42 101 -+25 42 101 26 43 101 27 43 101 29 47 104 36 52 108 40 57 112 -+46 61 115 48 64 117 48 64 117 48 64 117 48 64 117 48 64 117 -+48 64 117 48 64 117 48 64 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+48 64 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+48 64 117 48 64 117 48 64 116 48 64 117 48 64 117 48 64 117 -+48 64 117 49 65 117 44 60 114 39 55 110 34 50 107 27 44 103 -+26 43 101 25 42 101 25 42 101 24 41 100 24 41 100 24 41 100 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 25 42 101 36 52 108 44 60 114 45 60 114 46 61 115 -+45 60 114 45 60 114 45 60 114 44 59 113 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 44 60 114 45 60 114 44 60 114 44 60 114 -+44 60 114 43 60 114 44 60 114 44 60 114 44 60 114 43 60 114 -+44 60 114 43 59 113 34 50 107 25 42 101 24 41 101 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 -+34 50 107 39 55 110 40 56 111 39 55 110 39 55 111 40 56 111 -+39 55 111 39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 38 54 110 39 55 111 39 55 111 29 45 103 -+24 41 101 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 30 46 104 -+35 51 108 35 51 108 34 50 107 35 51 108 35 51 108 35 51 108 -+34 50 107 35 51 108 33 49 106 34 50 107 28 45 103 24 41 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 25 42 101 29 45 103 30 46 104 -+29 45 103 30 46 104 29 45 103 29 46 104 27 43 102 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 101 24 41 100 24 41 100 24 41 100 -+23 40 100 27 44 102 32 50 106 37 53 109 42 58 112 46 61 115 -+47 63 116 47 63 116 47 63 116 47 63 116 48 64 117 48 64 117 -+48 63 117 48 64 117 48 64 117 48 64 116 48 64 117 48 64 117 -+48 64 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+48 64 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 48 64 117 48 64 117 48 64 117 48 64 116 48 64 117 -+49 65 117 48 64 117 48 64 117 48 64 117 48 64 117 47 63 116 -+47 63 116 47 63 116 46 61 115 44 61 114 40 56 111 35 52 107 -+29 46 103 25 42 101 24 41 100 24 41 100 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 25 42 101 26 43 102 -+34 50 107 45 60 114 46 61 115 45 60 114 45 60 114 44 59 113 -+44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 44 60 114 44 60 114 43 60 114 43 60 114 44 60 114 -+44 60 114 44 60 114 43 59 113 44 60 114 44 60 114 43 59 113 -+39 55 111 28 45 102 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 26 43 102 36 52 108 -+40 56 111 39 55 110 39 55 111 40 56 111 39 55 111 38 54 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 37 53 109 27 44 102 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 30 46 104 35 51 108 -+34 50 107 35 51 108 35 51 108 35 51 108 34 50 107 35 51 108 -+34 50 107 33 49 106 34 50 107 29 46 103 25 42 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 27 44 102 29 46 104 30 46 104 -+30 46 104 29 45 103 30 46 104 27 44 102 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 23 40 100 23 40 99 24 41 100 -+28 45 103 31 47 105 35 52 107 38 54 110 40 57 112 42 58 112 -+44 60 114 46 61 115 47 63 116 48 64 117 48 64 117 48 64 117 -+48 64 117 49 65 117 48 64 117 48 64 117 48 64 117 48 64 117 -+48 64 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 48 64 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 48 64 117 48 64 117 48 64 117 48 64 116 48 64 117 -+48 64 117 48 64 117 48 64 117 48 64 117 48 64 117 48 64 117 -+47 63 116 46 61 115 43 59 113 42 58 112 40 56 111 36 52 108 -+34 50 106 30 46 104 26 43 101 23 40 99 23 40 100 24 41 100 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 24 41 100 29 45 103 35 52 107 44 60 114 -+46 61 115 46 61 115 45 60 114 45 60 114 44 59 113 44 59 113 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 45 60 114 -+44 60 114 44 60 114 43 60 114 43 60 114 44 60 114 44 60 114 -+44 60 114 43 59 113 44 60 114 44 60 114 40 56 111 33 49 106 -+24 41 100 24 41 100 24 41 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 29 45 103 38 54 109 40 56 111 -+39 55 110 40 56 111 40 56 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+38 54 110 39 55 111 36 52 108 27 44 102 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 25 42 101 30 46 104 35 51 108 34 50 107 -+35 51 108 35 51 108 35 51 108 34 50 107 35 51 108 34 50 107 -+34 50 107 34 50 107 30 46 104 24 41 101 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 26 43 102 29 45 103 30 46 104 30 46 104 -+29 45 103 30 46 104 28 45 103 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 26 43 102 -+28 45 103 30 46 104 31 47 105 33 49 106 36 52 108 38 56 110 -+42 57 112 44 60 114 47 63 116 50 65 118 50 65 118 49 65 117 -+48 64 117 49 65 117 48 64 117 48 64 117 48 64 117 48 64 117 -+48 64 117 48 64 117 48 64 117 48 64 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+48 64 117 48 64 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 49 65 117 -+49 65 117 49 65 117 49 65 117 49 65 117 48 64 117 48 64 117 -+48 64 117 48 64 117 48 64 116 48 64 117 48 64 117 48 64 117 -+49 64 117 48 64 117 49 65 117 49 65 117 50 65 118 48 64 117 -+46 61 115 43 59 113 40 57 112 38 54 110 34 50 107 32 50 106 -+31 47 105 29 45 103 27 44 102 25 42 101 24 41 100 24 41 100 -+24 41 100 24 41 100 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 29 46 104 38 54 109 43 59 113 46 61 115 46 61 115 -+45 60 114 45 60 114 44 59 113 44 59 113 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 44 60 114 45 60 114 45 60 114 44 60 114 -+44 60 114 43 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+43 59 113 44 60 114 43 59 113 34 50 107 26 43 102 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 25 42 101 33 49 106 39 55 110 40 56 111 39 55 110 -+39 55 111 40 56 111 39 55 111 39 55 111 38 54 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 38 54 110 38 54 111 -+39 55 111 34 50 107 26 43 102 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 30 46 104 34 50 107 35 51 108 35 51 108 -+35 51 108 35 51 108 35 51 108 35 51 108 34 50 107 34 50 107 -+34 50 107 30 46 104 25 42 101 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 26 43 101 29 46 104 30 46 104 29 45 103 29 45 103 -+30 46 104 29 45 103 25 42 101 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+24 41 100 24 41 100 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 26 43 101 26 43 102 26 43 102 29 47 104 32 50 106 -+36 52 108 39 55 110 40 57 112 44 61 114 47 63 116 49 64 117 -+48 64 117 48 64 117 48 64 117 48 64 117 48 64 117 48 64 117 -+48 64 117 48 64 117 48 64 117 48 64 117 48 64 117 48 64 116 -+48 64 117 48 64 117 48 64 117 48 64 117 48 64 117 48 64 117 -+48 64 117 48 64 117 48 64 117 48 64 117 48 64 117 48 64 117 -+49 65 117 49 65 117 48 64 117 48 64 117 48 64 117 48 64 117 -+48 64 117 48 64 117 48 64 117 48 64 117 48 64 117 48 64 117 -+48 64 117 48 64 117 48 64 117 48 64 116 48 64 117 48 64 117 -+48 64 117 48 64 117 48 64 117 48 64 117 48 64 117 48 64 117 -+48 64 117 48 64 117 49 65 117 48 64 116 46 61 115 43 59 113 -+40 57 112 37 53 109 34 50 107 31 47 105 28 45 103 26 43 102 -+26 43 102 26 43 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 101 24 41 100 23 40 100 29 46 104 -+40 56 111 45 60 114 46 61 115 46 61 115 45 60 114 45 60 114 -+45 60 114 44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 44 60 114 45 60 114 44 60 114 44 60 114 43 60 114 -+43 60 114 44 60 114 44 60 114 44 60 114 43 59 113 44 60 114 -+44 61 114 37 53 109 26 43 102 25 42 101 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+25 42 101 36 52 108 39 55 110 40 56 111 39 55 110 39 55 111 -+40 56 111 39 55 111 38 54 111 38 54 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 38 54 110 39 55 111 39 55 111 -+31 47 105 25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 30 46 104 35 51 108 35 51 108 34 50 107 35 51 108 -+35 51 108 35 51 108 34 50 107 35 51 108 33 49 106 34 50 107 -+29 46 104 25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+25 42 101 29 46 104 29 45 103 29 45 103 30 46 104 30 46 104 -+29 45 103 25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+24 41 100 24 41 100 24 41 100 24 41 100 23 40 100 24 41 100 -+27 44 102 29 45 103 31 47 105 34 50 106 35 51 108 37 53 109 -+39 55 110 40 57 112 42 58 112 43 60 114 46 61 115 46 61 115 -+46 61 115 46 61 115 46 61 115 47 63 116 47 63 116 47 63 116 -+47 63 116 47 63 116 47 63 116 47 63 116 47 63 116 47 63 116 -+47 63 116 47 63 116 47 63 116 47 63 116 47 63 116 47 63 116 -+47 63 116 47 63 116 47 63 116 47 63 116 47 63 116 47 63 116 -+46 61 115 46 61 115 46 61 115 46 61 115 44 61 114 43 59 113 -+40 57 112 40 56 111 38 56 110 36 52 108 34 50 107 32 50 106 -+29 47 104 27 44 102 25 42 101 23 40 100 24 41 100 24 41 100 -+24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 25 42 100 25 42 101 30 46 104 40 57 112 46 61 115 -+46 61 115 45 60 114 45 60 114 44 59 113 44 59 113 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+44 60 114 44 60 114 43 60 114 43 60 114 44 60 114 44 60 114 -+44 60 114 43 59 113 44 60 114 44 60 114 43 59 113 40 56 111 -+29 46 103 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 27 44 102 -+38 56 110 40 56 111 39 55 110 40 56 111 40 56 111 40 56 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 38 54 110 39 55 111 38 54 110 29 47 104 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+30 46 104 35 51 108 34 50 107 35 51 108 35 51 108 35 51 108 -+34 50 107 35 51 108 34 50 107 33 49 106 34 50 107 30 46 104 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 25 42 100 -+29 45 103 29 45 103 30 46 104 30 46 104 30 46 104 29 45 103 -+26 43 102 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 101 -+24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 23 40 100 -+23 40 100 23 40 100 23 40 100 23 40 99 23 40 99 23 40 100 -+24 41 100 25 42 101 26 43 101 27 44 102 27 44 103 28 45 103 -+29 45 103 29 46 104 29 46 104 29 47 104 29 47 104 29 47 104 -+29 47 104 31 47 105 29 47 104 29 47 104 29 47 104 30 46 104 -+29 46 104 29 46 104 29 46 104 28 45 103 27 44 102 27 44 102 -+26 43 101 25 42 101 24 41 100 23 40 99 23 40 99 23 40 100 -+23 40 100 23 40 100 23 40 100 24 41 100 24 41 100 24 41 100 -+24 41 100 24 41 100 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+27 44 102 33 49 106 40 56 111 46 61 115 46 61 115 45 60 114 -+45 60 114 44 59 113 44 59 113 44 59 113 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 44 60 114 45 60 114 44 60 114 44 60 114 -+44 60 114 43 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+43 60 114 44 60 114 44 60 114 40 56 111 33 49 106 25 42 100 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 25 42 101 31 47 105 40 56 111 -+40 56 111 39 55 110 39 55 111 40 56 111 39 55 111 39 55 111 -+38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+38 54 110 38 54 111 39 55 111 36 52 108 28 45 104 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 30 46 104 -+34 50 108 34 50 107 35 51 108 35 51 108 35 51 108 34 50 107 -+35 51 108 34 50 107 34 50 107 34 50 107 29 47 104 25 42 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 27 44 103 -+29 46 104 30 46 104 30 46 104 29 45 103 30 46 104 27 44 102 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 -+24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 -+24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 -+24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 -+24 41 100 24 41 100 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 100 24 41 100 23 40 100 29 46 103 37 53 109 -+42 57 112 46 61 115 46 61 115 45 60 114 45 60 114 44 59 113 -+44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+44 60 114 45 60 114 45 60 114 44 60 114 44 60 114 43 60 114 -+43 60 114 44 60 114 44 60 114 44 60 114 44 60 114 43 59 113 -+44 60 114 42 58 112 33 49 106 26 43 102 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 26 43 102 35 51 108 40 56 111 40 56 111 -+39 55 110 39 55 111 40 56 111 39 55 111 38 54 111 38 54 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 38 54 110 -+39 55 111 39 55 111 34 50 107 26 43 102 24 41 100 25 42 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 29 47 104 34 50 107 -+35 51 108 35 51 108 35 51 108 35 51 108 35 51 108 35 51 108 -+34 50 107 34 50 107 34 50 107 30 46 104 25 42 101 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 27 44 102 29 46 104 -+30 46 104 30 46 104 29 45 103 30 46 104 27 44 103 25 42 100 -+24 41 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 31 47 105 40 56 111 45 60 114 45 60 114 -+46 61 115 46 61 115 45 60 114 45 60 114 44 59 113 44 59 113 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 -+45 60 114 44 60 114 44 60 114 43 60 114 43 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 43 59 113 44 60 114 44 60 114 -+34 50 107 26 43 101 25 42 101 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 101 -+24 41 100 29 46 103 38 54 110 40 56 111 40 56 111 39 55 111 -+40 56 111 40 56 111 39 55 111 38 54 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+38 54 111 32 48 105 25 42 101 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 31 47 105 35 51 108 35 51 108 -+34 50 107 35 51 108 35 51 108 35 51 108 34 50 107 35 51 108 -+33 49 106 34 50 107 30 46 104 25 42 101 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 26 43 102 30 46 104 30 46 104 -+29 46 104 29 45 103 30 46 104 28 45 103 25 42 101 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 25 42 101 26 43 101 -+32 48 107 42 58 112 46 61 115 46 61 115 45 60 114 45 60 114 -+44 59 113 44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 44 60 114 -+43 60 114 43 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+43 59 113 44 60 114 44 60 114 43 59 113 37 53 109 26 43 102 -+24 41 100 25 42 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 25 42 101 -+33 49 106 40 56 111 40 56 111 39 55 110 39 55 111 40 56 111 -+39 55 111 38 54 111 38 54 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 38 54 110 38 54 111 39 55 111 38 54 110 -+30 48 104 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 24 41 100 31 47 105 35 51 108 34 50 107 35 51 108 -+35 51 108 35 51 108 34 50 107 35 51 108 34 50 107 33 49 106 -+34 50 107 30 46 104 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 25 42 101 30 46 104 29 45 103 30 46 104 -+29 46 104 30 46 104 29 45 103 25 42 101 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 100 -+24 41 100 24 41 100 26 43 101 30 46 104 36 52 108 44 59 113 -+47 63 116 46 61 115 45 60 114 45 60 114 44 59 113 44 59 113 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+44 60 114 45 60 114 44 60 114 44 60 114 44 60 114 43 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 43 59 113 44 60 114 -+44 60 114 42 58 112 37 53 109 29 46 103 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 27 44 102 36 52 108 -+40 56 111 39 55 110 39 55 111 40 56 111 40 56 111 39 55 111 -+38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 38 54 110 39 55 111 39 55 111 36 52 108 28 45 103 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+25 42 101 31 47 105 35 51 108 34 50 107 35 51 108 35 51 108 -+35 51 108 34 50 107 35 51 108 34 50 107 34 50 107 34 50 107 -+29 47 104 25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 101 -+24 41 100 26 43 101 29 46 104 29 45 103 30 46 104 29 46 104 -+30 46 104 29 46 104 26 43 101 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 23 40 100 -+27 44 103 35 52 107 40 56 111 45 60 114 46 61 115 46 61 115 -+45 60 114 45 60 114 45 60 114 44 59 113 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 45 60 114 -+45 60 114 44 60 114 44 60 114 43 60 114 43 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 43 59 113 44 60 114 43 60 114 -+36 52 108 29 46 103 24 41 101 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 31 47 105 38 54 109 40 56 111 -+40 56 111 39 55 111 40 56 111 39 55 111 39 55 111 38 54 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 34 50 107 26 43 101 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 -+32 48 107 35 51 108 35 51 108 35 51 108 35 51 108 35 51 108 -+35 51 108 35 51 108 34 50 107 34 50 107 34 50 107 30 46 104 -+25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+25 42 101 29 45 103 29 46 103 30 46 104 30 46 104 29 45 103 -+29 46 104 25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 24 41 100 31 47 105 39 55 111 -+44 60 114 45 60 114 46 61 115 46 61 115 45 60 114 45 60 114 -+44 59 113 44 59 113 44 59 113 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 44 60 114 45 60 114 44 60 114 -+44 60 114 43 60 114 43 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 43 59 113 44 60 114 44 60 114 38 54 110 27 44 103 -+25 42 101 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 26 43 101 36 52 108 39 55 110 40 56 111 39 55 110 -+39 55 111 40 56 111 39 55 111 38 54 111 38 54 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 38 54 110 -+39 55 111 39 55 111 31 47 105 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 101 33 49 106 -+35 51 108 35 51 108 34 50 107 35 51 108 35 51 108 35 51 108 -+34 50 107 35 51 108 33 49 106 34 50 107 29 46 104 25 42 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 101 -+28 45 104 30 46 104 29 45 103 30 46 104 29 45 103 30 46 104 -+26 43 102 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 24 41 100 24 41 100 -+25 42 101 27 44 102 34 50 107 43 59 113 46 61 115 46 61 115 -+45 60 114 45 60 114 44 59 113 44 59 113 44 59 113 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 -+45 60 114 44 60 114 44 60 114 44 60 114 43 60 114 43 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 43 59 113 44 60 114 -+44 60 114 43 59 113 39 55 111 29 45 103 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 101 24 41 100 25 42 101 -+28 45 103 38 54 109 40 56 111 39 55 110 39 55 111 40 56 111 -+40 56 111 38 54 111 38 54 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 38 54 110 39 55 111 39 55 111 -+37 53 109 28 45 103 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 26 43 101 33 49 106 35 51 108 -+34 50 107 35 51 108 35 51 108 35 51 108 34 50 107 35 51 108 -+34 50 107 33 49 106 34 50 107 30 46 104 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 101 28 45 103 -+30 46 104 29 46 104 30 46 104 30 46 104 30 46 104 27 44 102 -+24 41 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 25 42 101 28 45 103 32 50 106 -+39 55 111 44 60 115 47 63 116 46 61 115 45 60 114 45 60 114 -+45 60 114 44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 44 60 114 45 60 114 45 60 114 -+44 60 114 44 60 114 43 60 114 43 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 43 59 113 44 60 114 44 60 114 42 58 112 -+38 54 110 30 46 104 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 26 43 102 33 49 106 -+40 56 111 40 56 111 39 55 110 40 56 111 40 56 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 38 54 110 39 55 111 39 55 111 34 50 107 -+25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 26 43 102 32 50 106 35 51 108 34 50 107 -+35 51 108 35 51 108 35 51 108 34 50 107 35 51 108 34 50 107 -+34 50 107 34 50 107 30 46 104 25 42 101 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 25 42 101 27 44 103 30 46 104 -+29 45 103 30 46 104 29 45 103 30 46 104 27 44 102 25 42 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+23 40 99 27 44 102 34 50 107 39 55 110 43 58 114 46 61 115 -+46 61 115 45 60 114 45 60 114 45 60 114 44 59 113 44 59 113 -+44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 44 60 114 -+43 60 114 43 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 43 59 113 44 60 114 43 59 113 36 52 108 29 46 103 -+25 42 101 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 29 46 104 37 53 109 40 56 111 -+40 56 111 39 55 110 39 55 111 40 56 111 39 55 111 39 55 111 -+38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 38 54 110 39 55 111 39 55 110 31 47 105 25 42 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 26 43 102 34 50 107 35 51 108 35 52 107 35 51 108 -+35 51 108 35 51 108 35 51 108 35 51 108 34 50 107 34 50 107 -+34 50 107 29 46 103 25 42 101 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 27 44 102 30 46 104 29 45 103 -+30 46 104 29 45 103 30 46 104 28 45 103 25 42 101 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 24 41 100 31 47 105 -+40 56 111 44 60 114 45 60 114 46 61 115 46 61 115 46 61 115 -+45 60 114 45 60 114 44 59 113 44 59 113 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 -+45 60 114 45 60 114 44 60 114 44 60 114 44 60 114 43 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 43 59 113 43 60 114 -+44 60 114 44 60 114 36 52 108 27 44 102 25 42 101 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 25 42 100 33 49 106 39 55 110 40 56 111 39 55 110 -+39 55 111 40 56 111 40 56 111 39 55 111 38 54 111 38 54 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+38 54 110 39 55 111 37 53 109 26 43 102 25 42 101 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+27 44 102 34 50 107 35 51 108 34 50 107 35 51 108 35 51 108 -+35 51 108 35 51 108 34 50 107 35 51 108 34 50 106 34 50 107 -+28 45 103 25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 26 43 102 30 46 104 29 45 103 30 46 104 -+29 46 104 30 46 104 29 45 103 25 42 101 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 24 41 100 24 41 100 -+25 42 101 25 42 101 29 46 104 38 54 110 44 60 115 46 61 115 -+46 61 115 45 60 114 45 60 114 45 60 114 44 59 113 44 59 113 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 44 60 114 45 60 114 45 60 114 44 60 114 44 60 114 -+44 60 114 43 60 114 43 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 43 59 113 44 60 114 44 60 114 43 59 113 42 58 112 -+36 52 108 26 43 101 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 25 42 101 -+27 44 102 38 54 109 40 56 111 39 55 110 39 55 111 40 56 111 -+40 56 111 39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 38 54 110 39 55 111 -+38 54 110 34 50 108 25 42 101 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 28 45 103 -+34 50 107 34 50 107 35 51 108 35 51 108 35 51 108 35 51 108 -+34 50 107 35 51 108 34 50 107 33 49 106 33 49 106 28 45 103 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 101 -+24 41 100 26 43 102 30 46 104 29 45 103 30 46 104 29 45 103 -+30 46 104 29 46 104 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 24 41 100 25 42 101 28 45 103 32 48 107 -+37 53 109 43 59 113 46 61 115 46 61 115 46 61 115 45 60 114 -+45 60 114 44 59 113 44 59 113 44 59 113 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 44 60 114 44 60 114 44 60 114 43 60 114 -+43 60 114 44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 43 60 114 40 56 111 34 50 107 27 43 102 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 26 43 101 33 49 106 -+40 56 111 40 56 111 39 55 110 39 55 111 40 56 111 39 55 111 -+39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 38 54 110 39 55 111 39 55 111 37 53 109 -+31 47 105 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 28 45 103 34 50 107 -+35 51 108 35 51 108 35 51 108 35 51 108 35 51 108 35 51 108 -+35 51 108 34 50 107 34 50 107 33 49 106 28 45 103 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+26 43 101 29 46 104 29 45 103 30 46 104 30 46 104 30 46 104 -+29 45 103 26 43 101 25 42 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 101 24 41 100 23 40 100 -+24 41 100 29 46 104 36 52 108 40 56 111 43 58 114 46 61 115 -+46 61 115 46 61 115 45 60 114 45 60 114 45 60 114 44 59 113 -+44 59 113 44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 44 60 114 45 60 114 45 60 114 -+44 60 114 44 60 114 44 60 114 43 60 114 43 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 43 59 113 44 60 114 44 60 114 -+44 60 114 38 54 109 31 47 105 26 44 102 24 41 100 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 30 46 104 37 53 109 40 56 111 -+40 56 111 39 55 111 40 56 111 40 56 111 39 55 111 38 54 111 -+38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 38 54 110 39 55 111 39 55 111 34 50 107 27 44 102 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 101 30 46 104 34 50 107 35 51 108 -+34 50 107 35 51 108 35 51 108 35 51 108 34 50 107 35 51 108 -+34 50 107 34 50 107 33 49 106 27 44 102 24 41 101 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 26 43 101 -+29 46 104 29 45 103 29 46 104 30 46 104 29 45 103 30 46 104 -+26 43 102 24 41 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 24 41 100 25 42 100 30 46 104 37 53 109 -+43 58 114 45 60 114 45 60 114 46 61 115 46 61 115 46 61 115 -+45 60 114 45 60 114 45 60 114 44 59 113 44 59 113 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 44 60 114 -+44 60 114 43 60 114 43 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 37 53 109 -+28 45 103 25 42 101 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 25 42 101 35 51 108 39 55 110 40 56 111 40 56 111 -+39 55 110 40 56 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 38 54 111 32 48 107 25 42 101 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 31 47 105 34 50 107 35 51 108 34 50 107 -+35 51 108 35 51 108 35 51 108 34 50 107 35 51 108 34 50 107 -+34 50 107 33 49 106 26 43 102 25 42 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 29 46 104 -+30 46 104 29 46 104 30 46 104 29 45 103 30 46 104 26 43 102 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+35 51 108 28 45 103 25 42 101 25 42 101 24 41 101 24 41 100 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 24 41 100 24 41 100 25 42 101 25 42 101 -+26 43 102 31 47 105 38 54 110 45 60 114 46 61 115 46 61 115 -+45 60 114 45 60 114 45 60 114 45 60 114 44 59 113 44 59 113 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+44 60 114 44 60 114 44 60 114 43 60 114 43 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 43 59 113 42 58 112 36 52 108 26 43 102 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 25 42 101 -+28 45 103 38 54 110 40 56 111 39 55 110 39 55 111 40 56 111 -+39 55 111 39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 38 54 110 39 55 111 -+38 54 110 38 54 110 28 45 103 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+25 42 101 31 47 105 35 51 108 34 50 107 35 51 108 35 51 108 -+35 51 108 34 50 107 35 51 108 35 51 108 34 50 107 34 50 107 -+33 49 106 27 43 102 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 25 42 101 29 45 103 30 46 104 -+29 46 104 29 45 103 30 46 104 30 46 104 27 44 102 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+46 61 115 46 61 115 43 58 114 38 54 110 33 49 106 30 46 104 -+27 44 102 25 42 100 24 41 100 24 41 100 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 24 41 100 -+24 41 100 25 43 102 28 45 103 31 47 105 35 51 108 40 56 111 -+45 60 114 47 63 116 46 61 115 46 61 115 45 60 114 45 60 114 -+45 60 114 44 59 113 44 59 113 44 59 113 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 44 60 114 45 60 114 45 60 114 44 60 114 44 60 114 -+44 60 114 43 60 114 43 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 43 59 113 44 60 114 44 60 114 43 59 113 -+39 55 110 34 50 106 26 43 102 23 40 100 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 27 44 102 34 50 107 -+40 56 111 40 56 111 39 55 110 40 56 111 40 56 111 39 55 111 -+39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 38 54 110 -+34 50 107 26 43 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 26 43 101 -+32 48 105 35 51 108 35 52 107 35 51 108 35 51 108 35 51 108 -+35 51 108 35 51 108 34 50 107 34 50 107 34 50 107 32 48 107 -+26 43 101 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 25 42 101 29 45 103 30 46 104 29 45 103 -+30 46 104 30 46 104 30 46 104 27 44 102 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+45 60 114 45 60 114 46 61 115 46 61 115 46 61 115 44 60 114 -+42 57 112 39 55 110 35 51 108 29 47 104 25 42 101 23 40 100 -+24 41 100 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 23 40 100 24 41 100 27 44 103 32 48 107 -+37 53 109 40 56 111 43 58 114 46 61 115 46 61 115 46 61 115 -+46 61 115 45 60 114 45 60 114 45 60 114 44 59 113 44 59 113 -+44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 -+45 60 114 45 60 114 44 60 114 44 60 114 44 60 114 43 60 114 -+43 60 114 44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 44 61 114 40 57 112 34 50 107 30 46 104 -+25 42 101 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 25 42 100 32 50 106 38 54 110 40 56 111 -+40 56 111 39 55 110 39 55 111 40 56 111 39 55 111 39 55 111 -+38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 38 54 110 39 55 111 37 53 109 29 46 103 -+25 42 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 101 24 41 100 27 44 102 33 49 106 -+35 51 108 34 50 107 35 51 108 35 51 108 35 51 108 35 51 108 -+34 50 107 35 51 108 34 50 107 34 50 107 31 47 105 26 43 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 25 42 101 28 45 103 30 46 104 29 45 103 30 46 104 -+29 45 103 30 46 104 27 44 102 25 42 101 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 46 61 115 -+46 61 115 46 61 115 45 60 114 45 60 114 44 60 114 40 57 112 -+35 52 107 28 45 103 24 41 100 24 41 100 24 41 100 24 41 100 -+24 41 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 24 41 100 24 41 100 -+25 42 101 31 47 105 38 54 109 43 59 113 44 60 114 45 60 114 -+46 61 115 46 61 115 46 61 115 46 61 115 45 60 114 45 60 114 -+45 60 114 44 59 113 44 59 113 44 59 113 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 44 60 114 45 60 114 45 60 114 45 60 114 -+44 60 114 44 60 114 44 60 114 43 60 114 43 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 43 59 113 44 60 114 -+44 60 114 40 57 112 31 47 105 26 43 101 25 42 101 24 41 100 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 28 45 103 38 54 109 39 55 110 40 56 111 39 55 110 -+39 55 111 40 56 111 40 56 111 39 55 111 38 54 111 38 54 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+38 54 110 39 55 111 39 55 111 34 50 107 26 43 102 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 28 45 103 34 50 107 35 51 108 -+34 50 107 35 51 108 35 51 108 35 51 108 35 51 108 34 50 107 -+35 51 108 34 50 107 34 50 107 31 47 105 25 42 101 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+25 42 101 28 45 103 30 46 104 29 45 103 30 46 104 29 45 103 -+30 46 104 28 45 103 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+45 60 114 45 60 114 45 60 114 45 60 114 44 59 113 44 59 113 -+44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 46 61 115 -+46 61 115 46 61 115 45 60 114 40 56 111 34 50 107 29 46 103 -+26 43 101 25 42 101 25 42 101 24 41 101 24 41 100 24 41 100 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+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 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 25 42 101 -+25 42 101 26 43 101 27 43 102 31 47 105 37 53 109 42 58 112 -+47 63 116 46 61 115 46 61 115 46 61 115 45 60 114 45 60 114 -+45 60 114 44 59 113 44 59 113 44 59 113 44 59 113 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 44 60 114 44 60 114 44 60 114 43 60 114 43 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 43 59 113 -+44 60 114 44 60 114 44 60 114 43 59 113 43 59 113 37 53 109 -+28 45 103 23 40 100 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 26 43 101 -+34 50 107 40 56 111 40 56 111 39 55 110 39 55 111 40 56 111 -+40 56 111 39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 38 54 110 39 55 111 -+39 55 111 38 54 110 29 46 104 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 25 42 101 28 45 103 34 50 108 35 51 108 35 51 108 -+35 51 108 35 51 108 35 51 108 35 51 108 35 51 108 35 51 108 -+34 50 107 33 49 106 31 47 105 25 42 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 -+27 44 103 30 46 104 29 45 103 29 46 104 30 46 104 30 46 104 -+29 45 103 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 44 59 113 44 59 113 44 59 113 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 46 61 115 46 61 115 47 63 116 -+45 60 114 40 56 111 37 53 109 33 49 106 29 47 104 28 45 103 -+26 43 102 24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 24 41 100 24 41 100 -+24 41 100 25 42 101 27 44 102 29 46 103 31 47 105 34 50 107 -+38 54 110 42 58 112 46 61 115 47 63 116 46 61 115 46 61 115 -+45 60 114 45 60 114 45 60 114 45 60 114 44 59 113 44 59 113 -+44 59 113 44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 44 60 114 45 60 114 45 60 114 44 60 114 44 60 114 -+44 60 114 43 60 114 43 60 114 43 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 42 58 112 38 54 110 32 50 106 26 43 102 23 40 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 25 42 101 29 47 104 38 54 110 -+40 56 111 40 56 111 39 55 111 40 56 111 40 56 111 39 55 111 -+39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 38 54 110 39 55 111 38 56 110 -+34 50 107 26 43 102 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+25 42 101 30 46 104 35 51 108 35 51 108 34 50 107 35 51 108 -+35 51 108 35 51 108 34 50 107 35 51 108 34 50 107 34 50 107 -+33 49 106 30 46 104 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 101 27 44 103 -+30 46 104 29 45 103 30 46 104 29 45 103 30 46 104 27 44 103 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 44 59 113 44 59 113 -+44 59 113 44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 -+46 61 115 46 61 115 46 61 115 46 61 115 45 60 114 43 58 114 -+40 56 111 38 54 110 36 52 108 32 48 107 28 45 103 25 42 101 -+23 40 100 23 40 100 24 41 100 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+24 41 100 23 40 100 23 40 100 26 43 102 29 47 104 34 50 107 -+37 53 109 39 55 111 42 57 112 44 59 113 46 61 115 46 61 115 -+46 61 115 46 61 115 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 44 59 113 44 59 113 44 59 113 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 -+45 60 114 45 60 114 44 60 114 44 60 114 44 60 114 43 60 114 -+43 60 114 43 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 43 59 113 44 60 114 44 60 114 44 60 114 39 55 110 -+33 49 106 28 45 103 25 42 101 24 41 100 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 29 46 104 36 52 108 40 56 111 40 56 111 -+40 56 111 40 56 111 40 56 111 39 55 111 39 55 111 38 54 111 -+38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 38 54 110 39 55 111 39 55 111 37 53 109 29 46 104 -+25 42 101 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 25 43 102 -+32 48 107 35 51 108 35 51 108 34 50 107 35 51 108 35 51 108 -+35 51 108 34 50 107 35 51 108 34 50 107 34 50 107 33 49 106 -+27 44 103 24 41 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 101 28 45 103 30 46 104 -+29 45 103 30 46 104 29 46 104 30 46 104 28 45 103 25 42 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 44 59 113 44 59 113 44 59 113 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 46 61 115 46 61 115 -+46 61 115 46 61 115 45 60 114 45 60 114 44 60 114 44 60 114 -+42 57 112 37 53 109 34 50 106 29 46 104 24 41 100 24 41 100 -+24 41 100 24 41 100 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+24 41 100 24 41 100 24 41 100 23 40 100 26 43 102 31 47 105 -+35 51 108 39 55 110 43 58 114 44 60 114 45 60 114 45 60 114 -+46 61 115 46 61 115 46 61 115 46 61 115 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 44 59 113 44 59 113 44 59 113 -+44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 44 60 114 45 60 114 45 60 114 45 60 114 -+44 60 114 44 60 114 44 60 114 43 60 114 43 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 43 59 113 -+44 60 114 44 60 114 42 58 112 34 50 108 27 44 102 25 42 101 -+25 42 101 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+26 43 101 35 51 108 39 55 110 40 56 111 40 56 111 39 55 110 -+39 55 111 40 56 111 39 55 111 38 54 111 38 54 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 33 49 106 26 43 101 25 42 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 33 49 106 -+35 51 108 34 50 107 35 51 108 35 51 108 35 51 108 35 51 108 -+34 50 107 35 51 108 34 50 107 33 49 106 33 49 106 27 44 102 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 25 42 101 27 44 103 30 46 104 29 45 103 -+30 46 104 30 46 104 29 45 103 29 46 103 25 42 100 24 41 100 -+24 41 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 44 59 113 44 59 113 44 59 113 -+44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+46 61 115 46 61 115 46 61 115 46 61 115 47 63 116 44 59 113 -+39 55 111 36 52 108 32 48 105 27 44 103 26 43 102 26 43 101 -+25 42 101 25 42 101 25 42 101 24 41 101 24 41 100 24 41 100 -+24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 24 41 100 -+24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 26 43 101 27 44 102 30 46 104 -+34 50 107 37 53 109 40 57 112 44 60 115 46 61 115 46 61 115 -+46 61 115 46 61 115 46 61 115 45 60 114 45 60 114 45 60 114 -+45 60 114 44 59 113 44 59 113 44 59 113 44 59 113 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 44 60 114 45 60 114 45 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 43 60 114 43 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+43 59 113 44 60 114 44 60 114 44 60 114 43 59 113 42 58 112 -+38 54 110 29 46 104 24 41 100 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 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 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 25 42 100 25 42 101 31 47 105 -+39 55 111 40 56 111 39 55 110 40 56 111 40 56 111 39 55 111 -+39 55 111 38 54 111 38 54 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 38 54 111 38 54 110 39 55 111 -+38 54 110 38 54 110 29 46 103 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 101 26 43 102 34 50 107 35 51 108 -+34 50 107 35 51 108 35 51 108 35 51 108 35 51 108 35 51 108 -+35 51 108 34 50 107 34 50 107 33 49 106 27 43 101 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 25 42 101 27 44 102 30 46 104 29 45 103 30 46 104 -+29 45 103 30 46 104 29 45 103 25 42 101 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+45 60 114 45 60 114 44 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 44 59 113 44 59 113 44 59 113 44 59 113 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 46 61 115 -+46 61 115 46 61 115 47 63 116 47 63 116 46 61 115 43 58 114 -+40 56 111 38 54 110 35 51 108 33 49 106 31 47 105 30 46 104 -+29 45 103 27 44 102 26 43 102 25 42 101 24 41 100 24 41 100 -+24 41 100 24 41 100 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 -+24 41 100 24 41 100 24 41 100 24 41 100 24 41 101 25 43 102 -+27 44 102 27 44 103 29 46 104 31 47 105 32 48 105 34 50 107 -+36 52 108 38 54 110 42 57 112 44 60 114 47 63 116 47 63 116 -+46 61 115 46 61 115 46 61 115 46 61 115 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 44 59 113 44 59 113 44 59 113 -+44 59 113 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 44 60 114 -+44 60 114 43 60 114 43 60 114 43 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 43 60 114 40 57 112 37 53 109 32 50 106 25 42 101 -+23 40 100 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 25 42 101 30 46 104 37 53 109 40 56 111 -+40 56 111 39 55 110 39 55 111 40 56 111 39 55 111 39 55 111 -+38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 38 54 110 -+34 50 107 26 43 101 24 41 100 24 41 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 25 42 101 28 45 104 34 50 107 35 51 108 34 50 107 -+35 51 108 35 51 108 35 51 108 34 50 107 35 51 108 35 51 108 -+34 50 107 34 50 106 32 48 105 25 42 101 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+25 42 101 27 44 102 30 46 104 29 45 103 30 46 104 29 45 103 -+30 46 104 29 45 103 25 42 101 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+44 60 114 44 60 114 45 60 114 45 60 114 45 60 114 44 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 44 59 113 -+44 59 113 44 59 113 44 59 113 44 59 113 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 46 61 115 46 61 115 46 61 115 -+46 61 115 46 61 115 46 61 115 46 61 115 46 61 115 45 60 114 -+43 58 114 42 58 112 40 57 112 40 56 111 39 55 110 37 53 109 -+36 52 108 34 50 107 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 41 100 24 41 100 24 41 100 -+24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 -+24 41 100 24 41 100 23 40 100 23 40 100 23 40 100 23 40 100 -+23 40 100 24 41 101 26 43 101 27 44 102 29 45 103 31 47 105 -+33 49 106 34 50 107 36 52 108 38 54 109 39 55 110 40 56 111 -+42 57 112 42 58 112 44 59 113 45 60 114 46 61 115 46 61 115 -+46 61 115 46 61 115 46 61 115 46 61 115 46 61 115 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 44 59 113 44 59 113 -+44 59 113 44 59 113 44 59 113 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 44 60 114 45 60 114 45 60 114 45 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 43 60 114 43 60 114 -+43 60 114 44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 43 59 113 44 60 114 44 60 114 44 60 114 40 57 112 -+36 52 108 29 47 104 27 44 102 24 41 100 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 28 45 103 35 51 108 39 55 110 40 56 111 40 56 111 -+39 55 111 40 56 111 40 56 111 39 55 111 39 55 111 38 54 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 38 54 110 39 55 111 39 55 111 36 52 108 28 45 103 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+25 42 101 31 47 105 35 51 108 35 51 108 34 50 107 35 51 108 -+35 51 108 35 51 108 34 50 107 35 51 108 34 50 107 34 50 107 -+34 50 107 31 47 105 25 42 101 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 -+27 44 103 29 46 104 29 45 103 30 46 104 30 46 104 30 46 104 -+29 45 103 25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+43 60 114 44 60 114 44 60 114 44 60 114 44 60 114 45 60 114 -+45 60 114 45 60 114 44 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 44 59 113 44 59 113 -+44 59 113 44 59 113 44 59 113 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 46 61 115 46 61 115 46 61 115 -+46 61 115 46 61 115 46 61 115 46 61 115 46 61 115 46 61 115 -+45 60 114 45 60 114 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 25 42 101 26 43 102 -+27 44 103 28 45 103 29 46 104 30 46 104 31 47 105 33 49 106 -+34 50 107 35 51 108 37 53 109 38 54 110 40 56 111 42 57 112 -+44 59 113 44 59 113 44 60 114 44 60 114 44 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 46 61 115 46 61 115 46 61 115 -+46 61 115 46 61 115 46 61 115 46 61 115 46 61 115 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 44 59 113 -+44 59 113 44 59 113 44 59 113 44 59 113 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 -+45 60 114 45 60 114 45 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 43 60 114 43 60 114 43 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 43 60 114 44 60 113 -+44 60 114 44 60 114 42 58 112 36 52 108 28 45 103 25 42 101 -+25 42 101 24 41 100 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 25 42 101 25 42 101 24 41 100 26 43 102 -+36 52 108 39 55 110 40 56 111 40 56 111 39 55 110 40 56 111 -+40 56 111 39 55 111 39 55 111 38 54 111 38 54 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+38 54 110 39 55 111 39 55 111 30 46 104 25 42 101 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 -+33 49 106 35 51 108 35 51 108 35 51 108 35 51 108 35 51 108 -+35 51 108 34 50 107 35 51 108 34 50 107 33 49 106 34 50 107 -+29 46 104 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 27 44 103 -+29 46 104 29 45 103 29 46 104 30 46 104 29 45 103 30 46 104 -+25 42 101 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+44 60 114 44 60 114 44 60 114 44 60 114 43 60 114 43 60 114 -+43 60 114 43 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+45 60 114 45 60 114 45 60 114 44 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 44 59 113 44 59 113 44 59 113 44 59 113 -+44 59 113 44 59 113 44 59 113 44 59 113 45 60 114 45 60 114 -+45 60 114 45 60 114 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 61 115 46 61 115 46 61 115 -+46 61 115 46 61 115 46 61 115 46 61 115 46 61 115 46 61 115 -+46 61 115 46 61 115 46 61 115 46 61 115 46 61 115 46 61 115 -+46 61 115 46 61 115 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 44 59 113 -+44 59 113 44 59 113 44 59 113 44 59 113 44 59 113 44 59 113 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 -+45 60 114 45 60 114 45 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 43 60 114 43 60 114 43 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 43 59 113 -+44 60 114 44 60 114 44 60 114 43 59 113 43 59 113 40 57 112 -+35 51 108 28 45 103 24 41 100 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 41 100 25 42 101 25 42 101 31 47 105 38 56 110 -+40 56 111 40 56 111 39 55 111 40 56 111 40 56 111 39 55 111 -+39 55 111 38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 38 54 110 39 55 111 39 55 111 -+38 54 110 35 51 108 26 43 102 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 26 43 102 34 50 107 -+35 51 108 34 50 107 35 51 108 35 51 108 35 51 108 35 51 108 -+34 50 107 35 51 108 34 50 107 33 49 106 33 49 106 28 45 103 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 25 42 101 27 44 102 29 46 104 -+29 45 103 30 46 104 29 45 103 30 46 104 29 46 103 26 43 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 43 60 114 43 60 114 43 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 44 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 44 59 113 44 59 113 -+44 59 113 44 59 113 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 61 115 46 61 115 46 61 115 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 44 59 113 44 59 113 44 59 113 -+44 59 113 44 59 113 44 59 113 44 59 113 44 59 113 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 44 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+44 60 114 44 60 114 44 60 114 43 60 114 43 60 114 43 60 114 -+43 60 114 44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 43 59 113 44 60 114 44 60 114 44 60 114 -+43 59 113 40 56 111 38 54 109 34 50 107 29 45 103 24 41 100 -+24 41 100 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 26 43 102 31 47 105 38 54 109 40 56 111 40 56 111 -+39 55 110 39 55 111 40 56 111 39 55 111 39 55 111 38 54 111 -+38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 38 54 110 39 55 111 39 55 111 36 52 108 -+31 47 105 25 42 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 25 42 100 29 45 103 34 50 107 35 51 108 -+34 50 107 35 51 108 35 51 108 35 51 108 34 50 107 35 51 108 -+35 51 108 34 50 107 34 50 106 33 49 106 27 44 102 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 25 42 101 27 44 102 29 46 104 29 45 103 -+29 46 104 29 45 103 30 46 104 29 45 103 26 43 101 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+44 60 114 44 60 114 44 60 114 43 59 113 44 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 43 60 114 -+43 60 114 43 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 45 60 114 45 60 114 45 60 114 -+44 59 113 44 59 113 44 59 113 44 59 113 44 59 113 44 59 113 -+44 59 113 44 59 113 44 59 113 44 59 113 44 59 113 44 59 113 -+44 59 113 44 59 113 44 59 113 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 44 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+43 60 114 43 60 114 43 60 114 43 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 43 59 113 -+44 60 114 44 60 114 44 61 114 43 59 113 38 54 110 34 50 107 -+29 47 104 27 44 102 25 42 100 24 41 100 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 37 53 109 40 56 111 40 56 111 39 55 110 39 55 111 -+40 56 111 40 56 111 39 55 111 39 55 111 38 54 111 38 54 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 38 54 110 31 47 105 26 43 102 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 25 42 101 31 47 105 34 50 107 35 51 108 35 51 108 -+35 51 108 35 51 108 35 51 108 34 50 107 35 51 108 34 50 107 -+34 50 107 34 50 107 32 48 105 26 43 101 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 25 42 101 27 44 103 29 46 104 29 45 103 29 46 104 -+30 46 104 30 46 104 29 45 103 26 43 101 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+32 50 106 39 55 111 44 60 114 44 60 114 44 60 114 44 60 114 -+43 59 113 44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 43 60 114 43 60 114 43 60 114 43 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 44 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 44 59 113 44 59 113 44 59 113 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 43 60 114 43 60 114 43 60 114 43 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+43 59 113 36 52 108 29 46 104 26 43 101 25 42 101 25 42 101 -+24 41 100 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 40 56 111 39 55 110 39 55 111 40 56 111 -+39 55 111 39 55 111 38 54 111 38 54 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 38 54 110 -+39 55 111 39 55 111 35 51 108 26 43 102 25 42 101 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+26 43 101 33 49 106 35 51 108 35 51 108 34 50 107 35 51 108 -+35 51 108 35 51 108 35 51 108 35 51 108 34 50 107 33 49 106 -+34 50 107 31 47 105 25 42 101 24 41 101 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+25 42 101 27 44 103 29 46 104 29 45 103 29 46 104 30 46 104 -+29 45 103 30 46 104 26 43 101 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 25 42 101 29 47 104 36 52 108 40 57 112 -+43 59 113 43 59 113 43 59 113 44 60 114 44 60 114 44 60 114 -+43 59 113 44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 43 60 114 43 60 114 -+43 60 114 43 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+44 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 44 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+43 60 114 43 60 114 43 60 114 43 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 43 59 113 44 60 114 44 60 114 44 60 114 44 60 114 -+43 59 113 43 59 113 42 58 112 39 55 110 34 50 107 27 44 102 -+24 41 100 24 41 100 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 40 56 111 40 56 111 39 55 111 39 55 111 -+38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 38 54 110 39 55 111 38 54 110 -+37 53 109 29 46 104 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 27 44 102 -+34 50 107 35 52 107 34 50 108 35 51 108 35 51 108 35 51 108 -+34 50 107 35 51 108 35 51 108 34 50 107 33 49 106 34 50 107 -+29 46 104 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 -+27 44 102 29 46 104 29 45 103 30 46 104 29 45 103 30 46 104 -+29 46 103 26 43 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 24 41 100 24 41 100 -+27 44 102 31 47 105 36 52 108 38 56 110 40 57 112 43 59 113 -+44 60 114 44 60 114 44 60 114 44 60 114 43 59 113 44 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 43 60 114 43 60 114 43 60 114 43 60 114 -+43 60 114 44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+44 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 44 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 43 60 114 43 60 114 43 60 114 43 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 43 60 114 44 60 113 44 60 114 -+44 60 114 44 60 114 44 60 114 42 58 112 40 56 111 37 53 109 -+34 50 107 30 46 104 25 42 101 23 40 100 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 39 55 111 39 55 111 38 54 111 38 54 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 38 54 110 39 55 111 39 55 111 37 53 109 32 48 107 -+25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 25 42 101 30 46 104 34 50 107 -+35 51 108 35 51 108 35 51 108 35 51 108 35 51 108 34 50 107 -+35 51 108 34 50 107 34 50 107 34 50 107 32 50 106 27 44 103 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 101 27 44 102 -+30 46 104 29 45 103 29 46 104 29 45 103 30 46 104 29 45 103 -+26 43 101 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 24 41 100 24 41 100 25 42 101 27 44 102 30 46 104 -+32 50 106 36 52 108 40 56 111 44 60 114 44 61 114 44 60 114 -+44 60 114 44 60 114 43 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 43 60 114 43 60 114 43 60 114 43 60 114 43 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 44 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 43 60 114 43 60 114 43 60 114 -+43 60 114 43 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+43 59 113 44 60 114 44 60 114 44 60 114 44 60 115 42 58 112 -+38 54 110 34 50 107 31 47 105 28 45 103 26 43 102 24 41 100 -+24 41 100 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 39 55 111 38 54 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 110 32 48 107 27 44 102 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 26 43 102 32 48 107 35 51 108 35 51 108 -+34 50 107 35 51 108 35 51 108 35 51 108 35 51 108 35 51 108 -+34 50 107 34 50 107 34 50 107 32 48 105 26 43 102 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 101 27 44 103 30 46 104 -+29 45 103 30 46 104 30 46 104 30 46 104 29 45 103 26 43 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 24 41 100 24 41 100 -+24 41 101 25 42 101 25 42 101 26 43 101 29 46 104 34 50 108 -+39 55 110 43 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+43 60 114 44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+43 60 114 43 60 114 43 60 114 43 60 114 43 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 44 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 43 60 114 43 60 114 -+43 60 114 43 60 114 43 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 43 59 113 44 60 114 44 60 114 44 60 114 -+45 60 114 42 58 112 37 53 109 32 48 105 27 44 102 26 43 101 -+25 42 101 25 42 101 24 41 100 24 41 100 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 38 54 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 38 54 110 -+39 55 111 35 51 108 27 43 102 25 42 101 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 27 44 103 34 50 107 35 51 108 35 51 108 34 50 107 -+35 51 108 35 51 108 35 51 108 34 50 107 35 51 108 35 51 108 -+33 49 106 34 50 107 31 47 105 25 42 101 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 25 42 101 27 44 103 30 46 104 29 45 103 -+30 46 104 30 46 104 29 45 103 30 46 104 26 43 101 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+24 41 100 24 41 100 27 44 102 32 50 106 37 53 109 40 57 112 -+42 58 112 43 59 113 43 59 113 43 59 113 44 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 43 59 113 44 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 43 60 114 -+43 60 114 43 60 114 43 60 114 43 60 114 43 60 114 43 60 114 -+43 60 114 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 45 60 114 -+45 60 114 45 60 114 45 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 43 60 114 43 60 114 43 60 114 43 60 114 -+43 60 114 43 60 114 43 60 114 43 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 43 59 113 44 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 43 59 113 -+43 59 113 43 59 113 42 58 112 39 55 111 34 50 107 29 47 104 -+25 42 101 24 41 100 24 41 100 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 38 54 110 38 54 110 -+29 46 104 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 25 42 101 -+29 46 104 35 52 107 35 51 108 35 51 108 35 51 108 35 51 108 -+35 51 108 34 50 107 35 51 108 35 51 108 34 50 107 33 49 106 -+33 49 106 29 46 104 24 41 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 25 42 101 27 44 103 30 46 104 29 45 103 30 46 104 -+29 45 103 30 46 104 29 45 103 26 43 101 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 24 41 100 23 40 99 -+26 43 101 29 46 104 32 50 106 36 52 108 38 54 110 39 55 110 -+40 57 112 42 58 112 44 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 44 60 113 43 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 44 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 43 60 114 43 60 114 -+43 60 114 43 60 114 43 60 114 43 60 114 43 60 114 43 60 114 -+43 60 114 43 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+43 59 113 42 58 112 40 56 111 38 56 110 37 53 109 34 50 107 -+31 47 105 27 44 103 24 41 100 23 40 100 24 41 100 24 41 100 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 39 55 111 39 55 111 39 55 111 39 55 111 -+38 54 110 39 55 111 39 55 111 36 52 108 31 47 105 25 42 101 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 26 43 102 31 47 105 -+35 51 108 35 51 108 34 50 107 35 51 108 35 51 108 35 51 108 -+35 51 108 35 51 108 34 50 107 34 50 107 34 50 107 32 50 106 -+27 44 103 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+25 42 101 27 44 102 30 46 104 29 45 103 30 46 104 29 45 103 -+30 46 104 29 45 103 25 42 101 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 26 43 101 -+27 44 103 29 46 104 31 47 105 33 49 106 36 52 108 38 56 110 -+40 57 112 43 60 114 44 61 114 45 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 43 59 113 44 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 43 60 114 43 60 114 43 60 114 -+43 60 114 43 60 114 43 60 114 43 60 114 43 60 114 43 60 114 -+43 60 114 43 60 114 43 60 114 43 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 43 60 114 -+44 60 113 44 60 114 44 60 114 44 60 114 44 60 114 44 61 114 -+44 61 114 42 58 112 40 56 111 37 53 109 34 50 108 32 48 105 -+29 47 104 28 45 103 27 44 102 25 42 101 24 41 100 24 41 100 -+24 41 100 24 41 100 24 41 100 24 41 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 39 55 111 39 55 111 38 54 110 39 55 111 -+39 55 111 38 54 110 31 47 105 26 43 102 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 28 45 103 33 49 106 35 51 108 -+34 50 107 35 51 108 35 51 108 35 51 108 35 51 108 34 50 107 -+35 51 108 35 51 108 34 50 107 34 50 107 31 47 105 26 43 101 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 -+28 45 103 30 46 104 29 45 103 30 46 104 30 46 104 30 46 104 -+29 45 103 25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+24 41 100 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+26 43 101 26 43 101 27 44 103 31 47 105 34 50 107 37 53 109 -+40 57 112 43 59 113 44 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 43 59 113 44 60 114 44 60 114 -+44 60 114 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 44 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 43 59 113 -+44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 42 58 112 38 56 110 36 52 108 32 50 106 29 46 104 -+26 43 101 26 43 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 39 55 111 38 54 110 39 55 111 38 54 111 -+32 50 106 25 42 101 25 42 101 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 31 47 105 34 50 107 35 51 108 34 50 107 -+35 51 108 35 51 108 35 51 108 35 51 108 34 50 107 35 51 108 -+34 50 107 34 50 107 34 50 107 29 46 104 25 42 101 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 28 45 103 -+30 46 104 29 45 103 30 46 104 30 46 104 29 45 103 30 46 104 -+25 42 101 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 24 41 100 24 41 100 -+24 41 100 24 41 100 25 42 101 27 44 103 31 47 105 34 50 106 -+36 52 108 38 56 110 40 57 112 42 58 112 42 58 112 43 59 113 -+43 59 113 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 44 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 44 60 114 43 60 114 43 59 113 43 59 113 -+43 59 113 43 59 113 43 59 113 42 58 112 42 58 112 42 58 112 -+40 56 111 37 53 109 35 52 107 32 48 107 29 46 104 27 44 102 -+24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 39 55 111 38 54 110 35 51 108 26 43 102 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 0 0 0 0 0 0 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 24 41 101 -+26 43 101 33 49 106 35 51 108 34 50 107 35 51 108 35 51 108 -+35 51 108 35 51 108 34 50 107 35 51 108 35 51 108 34 50 107 -+34 50 107 33 49 106 27 44 103 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 25 42 101 27 44 103 30 46 104 -+29 45 103 29 46 104 29 45 103 29 46 104 29 45 103 25 42 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 24 41 100 24 41 100 -+24 41 100 23 40 100 23 40 100 24 41 100 25 43 102 27 44 102 -+29 46 104 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 44 60 114 44 60 114 44 60 114 -+44 60 114 44 60 114 43 59 113 43 59 113 43 59 113 42 58 112 -+42 58 112 40 57 112 40 57 112 40 56 111 40 56 111 39 55 110 -+38 56 110 38 54 110 37 53 109 36 52 108 35 52 107 33 49 106 -+32 48 105 29 47 104 28 45 103 27 43 102 25 42 100 23 40 100 -+23 40 100 23 40 100 24 41 100 24 41 100 24 41 100 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 34 50 107 28 45 103 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 28 45 103 -+34 50 108 35 51 108 34 50 107 35 51 108 35 51 108 35 51 108 -+35 51 108 34 50 107 35 51 108 34 50 107 34 50 107 34 50 107 -+32 48 105 26 43 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 25 42 101 29 45 103 30 46 104 29 45 103 -+30 46 104 30 46 104 30 46 104 28 45 103 25 42 101 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 24 41 100 -+24 41 100 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 32 50 106 32 48 107 31 47 105 -+31 47 105 31 47 105 29 47 104 29 47 104 29 46 104 29 46 104 -+28 45 103 28 45 103 27 44 103 27 44 102 26 43 102 26 43 101 -+25 42 101 24 41 101 24 41 100 24 41 100 24 41 100 24 41 100 -+24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+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 42 101 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 25 42 101 32 48 105 34 50 107 -+35 51 108 35 51 108 35 51 108 35 51 108 35 51 108 35 51 108 -+34 50 107 35 51 108 34 50 107 33 49 106 34 50 107 29 46 104 -+25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 25 42 101 29 45 103 30 46 104 29 45 103 30 46 104 -+29 46 104 30 46 104 27 44 103 25 42 101 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 100 24 41 101 24 41 100 -+24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 -+24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 -+24 41 100 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+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 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 28 45 103 34 50 107 35 52 107 35 51 108 -+34 50 107 35 51 108 35 51 108 35 51 108 35 51 108 35 51 108 -+35 51 108 34 50 107 34 50 107 34 50 107 27 44 102 24 41 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+25 42 101 29 46 104 30 46 104 29 46 104 30 46 104 29 45 103 -+30 46 104 29 46 104 24 41 100 24 41 100 24 41 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 24 41 100 25 42 101 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+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 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+25 42 101 31 47 105 34 50 108 34 50 107 35 51 108 35 51 108 -+35 51 108 35 51 108 34 50 107 35 51 108 35 51 108 34 50 107 -+33 49 106 33 49 106 32 50 106 25 42 101 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 26 43 102 -+29 46 104 29 45 103 29 46 104 29 45 103 30 46 104 30 46 104 -+28 45 103 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 24 41 100 27 44 102 30 46 104 36 52 108 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+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 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 27 44 103 -+33 49 106 35 51 108 35 51 108 35 51 108 35 51 108 35 51 108 -+35 51 108 34 50 107 35 51 108 34 50 107 34 50 107 34 50 106 -+33 49 106 30 46 104 24 41 101 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 26 43 102 30 46 104 -+29 45 103 29 46 104 30 46 104 30 46 104 30 46 104 27 44 102 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+24 41 100 28 45 103 34 50 107 37 53 109 40 56 111 40 56 111 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+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 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 25 42 101 31 47 105 34 50 107 -+35 51 108 34 50 107 35 51 108 35 51 108 35 51 108 35 51 108 -+35 51 108 35 51 108 34 50 107 34 50 107 34 50 107 33 49 106 -+27 44 103 25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 25 42 101 27 44 102 29 46 104 29 45 103 -+30 46 104 30 46 104 29 45 103 30 46 104 27 44 102 25 42 101 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 25 42 101 31 47 105 -+37 53 109 39 55 110 40 56 111 40 56 111 40 56 111 39 55 110 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+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 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 26 43 102 33 49 106 35 51 108 35 51 108 -+34 50 107 35 51 108 35 51 108 35 51 108 35 51 108 34 50 107 -+35 51 108 35 51 108 33 49 106 34 50 107 31 47 105 25 42 101 -+24 41 101 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 27 44 103 30 46 104 30 46 104 30 46 104 -+30 46 104 29 45 103 30 46 104 27 44 102 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+25 42 101 25 42 101 26 43 102 34 50 107 39 55 110 40 56 111 -+40 56 111 39 55 110 40 56 111 39 55 111 40 56 111 39 55 111 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+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 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+25 42 101 29 46 104 35 51 108 35 51 108 34 50 107 35 51 108 -+35 51 108 35 51 108 35 51 108 35 51 108 35 51 108 35 51 108 -+34 50 107 33 49 106 33 49 106 29 45 103 25 42 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+25 42 101 28 45 103 30 46 104 29 45 103 30 46 104 29 45 103 -+30 46 104 30 46 104 27 44 102 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 24 41 100 25 42 101 27 44 103 -+31 47 105 36 52 108 40 56 111 40 56 111 40 56 111 39 55 110 -+39 55 111 40 56 111 40 56 111 40 56 111 39 55 111 39 55 111 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+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 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 27 44 102 -+32 50 106 35 51 108 34 50 107 35 51 108 35 51 108 35 51 108 -+35 51 108 35 51 108 34 50 107 35 51 108 34 50 107 34 50 107 -+34 50 107 31 47 105 26 44 102 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 25 42 101 -+28 45 103 30 46 104 29 45 103 30 46 104 29 46 104 30 46 104 -+29 45 103 26 43 102 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 26 43 102 31 47 105 36 52 108 38 54 110 -+40 56 111 40 56 111 40 56 111 39 55 110 40 56 111 39 55 111 -+40 56 111 39 55 111 39 55 111 39 55 111 38 54 111 38 54 111 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+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 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 25 42 101 31 47 105 34 50 107 -+35 51 108 34 50 107 35 51 108 35 51 108 35 51 108 35 51 108 -+34 50 107 35 51 108 35 51 108 34 50 107 34 50 107 33 49 106 -+29 46 104 25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 28 45 103 -+30 46 104 29 46 104 30 46 104 29 45 103 30 46 104 29 46 104 -+26 43 101 24 41 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 24 41 100 -+29 46 104 36 52 108 38 56 110 39 55 110 40 56 111 40 56 111 -+40 56 111 39 55 110 39 55 111 40 56 111 40 56 111 40 56 111 -+39 55 111 39 55 111 38 54 111 38 54 111 39 55 111 39 55 111 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+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 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 27 44 102 34 50 107 34 50 108 35 51 108 -+34 50 107 35 51 108 35 51 108 35 51 108 35 51 108 34 50 107 -+35 51 108 34 50 107 34 50 107 34 50 107 33 49 106 26 43 102 -+25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 25 42 101 30 46 104 29 46 104 -+29 45 103 30 46 104 29 45 103 30 46 104 29 45 103 25 42 101 -+25 42 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+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 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+24 41 100 25 42 101 25 42 101 27 44 102 33 49 106 39 55 110 -+40 56 111 40 56 111 40 56 111 39 55 111 39 55 111 40 56 111 -+40 56 111 39 55 111 39 55 111 39 55 111 38 54 111 38 54 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+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 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+25 42 101 31 47 105 35 51 108 34 50 107 35 51 108 35 51 108 -+35 51 108 35 51 108 35 51 108 34 50 107 35 51 108 34 50 107 -+34 50 107 33 49 106 33 49 106 31 47 105 24 41 101 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 26 43 102 30 46 104 29 45 103 30 46 104 -+30 46 104 30 46 104 30 46 104 28 45 103 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+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 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 0 0 0 0 0 0 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 0 0 0 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 42 101 25 42 101 24 41 100 24 41 100 24 41 100 26 43 101 -+28 45 103 32 48 105 36 52 108 40 56 111 40 56 111 40 56 111 -+39 55 110 40 56 111 39 55 111 40 56 111 40 56 111 39 55 111 -+39 55 111 38 54 111 38 54 111 38 54 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+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 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 25 42 101 27 44 103 -+33 49 106 35 51 108 35 51 108 35 51 108 35 51 108 35 51 108 -+35 51 108 34 50 107 35 51 108 35 51 108 34 50 107 33 49 106 -+34 50 107 32 48 107 28 45 103 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+25 42 100 27 44 102 30 46 104 29 45 103 30 46 104 30 46 104 -+29 45 103 30 46 104 27 44 103 25 42 101 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+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 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 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 52 108 -+39 55 110 40 56 111 40 56 111 40 56 111 39 55 110 40 56 111 -+40 56 111 40 56 111 40 56 111 39 55 111 39 55 111 39 55 111 -+38 54 111 38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+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 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+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 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 27 43 102 32 48 105 35 52 107 -+35 51 108 34 50 107 35 51 108 35 51 108 35 51 108 35 51 108 -+35 51 108 35 51 108 34 50 107 34 50 107 34 50 107 34 50 107 -+30 46 104 25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+28 45 103 29 45 103 30 46 104 30 46 104 29 46 104 29 45 103 -+30 46 104 27 44 102 25 42 101 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+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 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 40 56 111 -+40 56 111 40 56 111 40 56 111 39 55 111 40 56 111 40 56 111 -+39 55 111 39 55 111 39 55 111 38 54 111 38 54 111 38 54 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 38 54 110 39 55 111 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+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 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+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 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 29 46 104 34 50 107 35 52 107 35 51 108 -+34 50 107 35 51 108 35 51 108 35 51 108 35 51 108 34 50 107 -+35 51 108 35 51 108 33 49 106 34 50 107 33 49 106 26 43 102 -+25 42 101 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 25 42 101 28 45 103 -+30 46 104 30 46 104 29 45 103 29 46 104 30 46 104 29 46 104 -+26 43 102 25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+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 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+40 56 111 40 56 111 39 55 111 39 55 111 39 55 111 38 54 111 -+38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+38 54 110 39 55 111 39 55 111 38 54 110 38 54 110 36 52 108 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+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 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+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 42 101 24 41 100 24 41 100 25 42 101 -+26 43 101 33 49 106 35 51 108 35 52 107 34 50 108 35 51 108 -+35 51 108 35 51 108 35 51 108 35 51 108 35 51 108 35 51 108 -+34 50 107 33 49 106 33 49 106 31 47 105 25 42 101 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 25 42 101 29 46 104 29 45 103 -+29 46 104 30 46 104 29 45 103 30 46 104 29 45 103 27 43 102 -+25 42 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+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 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+39 55 111 39 55 111 38 54 111 38 54 111 38 54 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 38 54 110 39 55 111 -+39 55 111 38 54 111 36 52 108 34 50 106 28 45 103 24 41 100 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 34 50 107 -+34 50 107 32 48 107 27 44 103 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 26 43 102 29 45 103 29 45 103 30 46 104 -+30 46 104 29 45 103 30 46 104 29 45 103 26 43 101 24 41 100 -+24 41 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+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 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+38 54 111 38 54 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 38 54 110 39 55 111 39 55 111 38 54 111 -+34 50 107 29 46 104 26 43 102 24 41 100 24 41 100 24 41 100 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 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 49 106 -+29 46 104 25 42 101 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 0 0 0 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 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+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 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 101 24 41 100 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+38 54 110 39 55 111 39 55 111 37 53 109 31 47 105 25 42 101 -+25 42 101 24 41 100 24 41 100 24 41 100 25 42 101 25 42 101 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 26 43 102 -+25 42 101 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 0 0 0 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 42 101 25 42 101 25 42 101 25 42 101 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+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 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 29 46 104 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+39 55 111 39 55 111 39 55 111 39 55 111 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+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 42 101 25 42 101 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 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 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 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 42 101 25 42 101 25 42 101 25 42 101 25 42 101 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+27 44 102 25 42 101 24 41 100 24 41 100 24 41 100 24 41 100 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+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 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 -+25 42 101 25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+39 55 111 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+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 42 101 25 42 101 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 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 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 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 42 101 25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+37 53 109 36 52 108 33 49 106 29 47 104 27 44 102 24 41 100 -+24 41 100 24 41 100 24 41 100 24 41 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 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 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+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 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 -+25 42 101 25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 24 41 100 24 41 100 25 42 101 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+39 55 111 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+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 42 101 25 42 101 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 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 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 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 42 101 25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+40 56 111 40 56 111 39 55 110 39 55 110 39 55 110 38 54 109 -+35 51 108 31 47 105 26 43 102 24 41 100 24 41 100 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 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 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+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 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 -+25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 24 41 100 24 41 100 25 42 101 -+29 46 103 32 50 106 37 53 109 39 55 110 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+38 54 110 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+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 42 101 25 42 101 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 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 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 25 42 101 -+25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+40 56 111 39 55 111 40 56 111 40 56 111 39 55 110 40 56 111 -+40 56 111 40 56 111 40 56 111 39 55 110 36 52 108 31 47 105 -+27 44 103 25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 -+24 41 100 24 41 100 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 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 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 -+25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 41 100 24 41 100 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 26 43 102 30 46 104 33 49 106 37 53 109 40 56 111 -+40 56 111 40 56 111 40 56 111 39 55 110 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+38 54 110 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+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 42 101 25 42 101 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 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 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 25 42 101 -+25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+39 55 111 40 56 111 40 56 111 40 56 111 39 55 111 40 56 111 -+40 56 111 40 56 111 39 55 110 40 56 111 40 56 111 40 56 111 -+40 56 111 39 55 111 37 53 109 34 50 107 31 47 105 29 46 104 -+27 44 103 26 43 102 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 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 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 27 44 102 28 45 103 29 47 104 33 49 106 35 51 108 -+38 54 109 40 56 111 40 56 111 40 56 111 40 56 111 40 56 111 -+39 55 111 40 56 111 40 56 111 39 55 111 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 44 103 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+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 42 101 25 42 101 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 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 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 25 42 101 -+25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+38 54 111 39 55 111 39 55 111 39 55 111 40 56 111 40 56 111 -+40 56 111 40 56 111 39 55 111 40 56 111 40 56 111 40 56 111 -+40 56 111 40 56 111 40 56 111 40 56 111 40 56 111 39 55 111 -+38 54 110 37 53 109 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 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 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 52 108 37 53 109 39 55 110 40 56 111 40 56 111 40 56 111 -+40 56 111 40 56 111 39 55 110 40 56 111 40 56 111 40 56 111 -+39 55 111 40 56 111 40 56 111 40 56 111 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 41 100 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+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 42 101 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 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 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 25 42 101 -+25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+38 54 111 38 54 111 38 54 111 38 54 111 39 55 111 39 55 111 -+39 55 111 39 55 111 40 56 111 40 56 111 40 56 111 40 56 111 -+40 56 111 40 56 111 40 56 111 40 56 111 40 56 111 40 56 111 -+40 56 111 40 56 111 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 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 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+40 56 111 40 56 111 40 56 111 40 56 111 39 55 110 40 56 111 -+40 56 111 40 56 111 39 55 111 40 56 111 40 56 111 40 56 111 -+40 56 111 39 55 111 39 55 111 39 55 111 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 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 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 38 54 111 38 54 111 38 54 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 40 56 111 40 56 111 -+40 56 111 40 56 111 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 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 42 101 -+24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+39 55 111 40 56 111 40 56 111 40 56 111 40 56 111 39 55 111 -+39 55 111 39 55 111 39 55 111 38 54 111 38 54 111 38 54 111 -+38 54 111 38 54 111 39 55 111 39 55 111 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 25 42 101 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 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 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 38 54 111 -+38 54 111 38 54 111 38 54 111 39 55 111 39 55 111 39 55 111 -+39 55 111 40 56 111 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 32 48 105 -+29 47 104 29 46 104 28 45 103 27 44 102 27 43 102 26 43 101 -+25 42 101 24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+40 56 111 39 55 111 39 55 111 39 55 111 39 55 111 38 54 111 -+38 54 111 38 54 111 38 54 111 38 54 111 39 55 111 39 55 111 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+25 42 100 27 43 102 29 47 104 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 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 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 38 54 111 38 54 111 38 54 111 -+38 54 111 39 55 111 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 40 56 111 -+40 56 111 39 55 111 39 55 110 38 54 109 37 53 109 36 52 108 -+36 52 108 35 52 107 34 50 107 32 50 106 31 47 105 29 47 104 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 41 100 24 41 100 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+39 55 111 38 54 111 38 54 111 38 54 111 38 54 111 38 54 111 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 26 43 102 -+31 47 105 34 50 107 35 51 108 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 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 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 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 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 38 54 111 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 40 56 111 -+39 55 110 40 56 111 40 56 111 40 56 111 40 56 111 40 56 111 -+40 56 111 40 56 111 40 56 111 39 55 110 39 55 110 39 55 110 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 52 108 37 53 109 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 25 42 101 31 47 105 34 50 107 -+34 50 107 35 51 108 34 50 107 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 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 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+38 54 110 38 54 110 38 54 110 39 55 111 39 55 111 39 55 111 -+39 55 111 38 54 110 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 40 56 111 -+40 56 111 40 56 111 40 56 111 40 56 111 40 56 111 39 55 111 -+40 56 111 40 56 111 40 56 111 40 56 111 40 56 111 40 56 111 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+40 56 111 40 56 111 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+25 42 101 25 42 101 30 46 104 35 51 108 35 51 108 34 50 107 -+35 51 108 35 51 108 35 51 108 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 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 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 0 0 0 0 0 0 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+26 43 102 29 46 104 32 50 106 34 50 108 36 52 108 38 54 110 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 38 54 110 -+39 55 111 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 39 55 111 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 40 56 111 -+40 56 111 40 56 111 40 56 111 40 56 111 40 56 111 40 56 111 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+40 56 111 40 56 111 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 24 41 100 24 41 100 24 41 100 26 43 102 -+29 46 104 34 50 107 35 51 108 35 51 108 35 51 108 35 51 108 -+35 51 108 35 51 108 35 51 108 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 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 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 44 103 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 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 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+24 41 100 24 41 100 24 41 100 25 42 101 26 43 102 27 44 103 -+29 46 104 32 50 106 35 51 108 38 54 110 39 55 111 39 55 111 -+39 55 111 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 38 54 111 -+38 54 111 38 54 111 38 54 111 38 54 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+40 56 111 40 56 111 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 25 42 101 25 42 101 -+25 42 101 24 41 100 24 41 100 26 43 102 31 47 105 33 49 106 -+35 51 108 35 51 108 34 50 107 35 51 108 35 51 108 35 51 108 -+35 51 108 35 51 108 34 50 107 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 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 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 46 104 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 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 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 24 41 100 -+24 41 100 25 42 101 25 42 101 25 42 101 27 44 102 30 46 104 -+34 50 106 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 38 54 111 38 54 111 -+38 54 111 38 54 111 38 54 111 38 54 111 38 54 111 38 54 111 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+39 55 111 39 55 111 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 25 42 101 24 41 100 -+24 41 100 25 42 101 31 47 105 34 50 107 34 50 107 35 51 108 -+34 50 107 35 51 108 35 51 108 35 51 108 35 51 108 35 51 108 -+35 51 108 35 51 108 35 51 108 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 25 42 101 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 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 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 100 24 41 100 -+24 41 100 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+39 55 111 39 55 111 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 41 100 25 42 101 26 43 101 -+29 47 104 35 51 108 35 51 108 34 50 107 35 51 108 35 51 108 -+35 51 108 35 51 108 35 51 108 35 51 108 35 51 108 35 51 108 -+34 50 107 34 50 107 33 49 106 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 25 42 101 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+39 55 111 39 55 111 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 44 102 29 47 104 34 50 107 -+35 51 108 35 51 108 35 51 108 35 51 108 35 51 108 35 51 108 -+35 51 108 35 51 108 34 50 107 35 51 108 34 50 107 34 50 107 -+34 50 107 34 50 107 33 49 106 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+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 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+39 55 111 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 34 50 107 35 51 108 35 51 108 -+34 50 107 35 51 108 35 51 108 35 51 108 35 51 108 35 51 108 -+34 50 107 35 51 108 35 51 108 34 50 107 34 50 107 34 50 107 -+34 50 107 31 47 105 27 43 102 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 -+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 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 39 55 111 39 55 111 -+39 55 111 39 55 111 39 55 111 39 55 111 38 54 111 39 55 110 -+39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 39 55 111 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+39 55 111 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 51 108 34 50 107 35 51 108 -+35 51 108 35 51 108 35 51 108 35 51 108 35 51 108 34 50 107 -+35 51 108 34 50 107 34 50 107 34 50 106 34 50 107 32 48 107 -+26 43 102 25 42 101 24 41 100 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+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 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 26 43 101 28 45 103 -+29 47 104 32 48 107 34 50 107 36 52 108 37 53 109 38 54 110 -+38 54 110 38 54 110 38 54 110 38 54 110 38 54 110 38 54 110 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+39 55 111 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 51 108 35 51 108 35 51 108 -+35 51 108 35 51 108 35 51 108 35 51 108 34 50 107 34 50 107 -+33 49 106 34 50 107 33 49 106 32 50 106 27 44 102 25 42 100 -+24 41 100 25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 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 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+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 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 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 41 100 24 41 100 -+24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 25 42 101 -+27 43 102 27 44 102 29 45 103 30 46 104 31 47 105 32 50 106 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+37 53 109 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 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 51 108 35 51 108 -+34 50 107 35 51 108 34 50 107 34 50 107 34 50 107 34 50 107 -+33 49 106 31 47 105 27 44 103 25 42 100 24 41 100 24 41 101 -+25 42 101 25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 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 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+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 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 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 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 24 41 101 24 41 100 -+24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 24 41 100 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 44 103 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 34 50 107 35 51 108 -+35 51 108 34 50 107 34 50 107 34 50 107 34 50 106 31 47 105 -+27 43 102 25 42 101 24 41 100 24 41 100 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 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 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+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 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+0 0 0 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 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 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 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 41 100 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 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 51 108 34 50 107 -+34 50 107 34 50 107 34 50 107 31 47 105 26 43 101 25 42 101 -+24 41 100 24 41 100 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 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 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+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 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+0 0 0 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 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 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 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 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 49 106 -+33 49 106 31 47 105 26 43 102 24 41 100 24 41 100 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 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 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+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 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+0 0 0 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 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 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 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 41 100 24 41 100 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 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 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+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 42 101 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+0 0 0 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 42 101 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 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 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+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 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 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 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 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 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 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 42 101 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 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 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 25 42 101 25 42 101 25 42 101 25 42 101 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 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 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 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 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 25 42 101 25 42 101 25 42 101 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 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 42 101 -+25 42 101 25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 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 42 101 -+25 42 101 25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 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 42 101 -+25 42 101 25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 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 42 101 -+25 42 101 25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 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 42 101 -+25 42 101 25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 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 42 101 -+25 42 101 25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+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 42 101 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 25 42 101 25 42 101 -+25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 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 42 101 -+25 42 101 25 42 101 25 42 101 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+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 42 101 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 25 42 101 25 42 101 -+25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 25 42 101 25 42 101 -+25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 25 42 101 25 42 101 -+25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 25 42 101 25 42 101 -+25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 25 42 101 25 42 101 -+25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 25 42 101 25 42 101 -+25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 25 42 101 25 42 101 -+25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 25 42 101 25 42 101 -+25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 25 42 101 25 42 101 -+25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 25 42 101 25 42 101 -+25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 25 42 101 25 42 101 -+25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 0 0 0 0 0 0 -+25 42 101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 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 42 101 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 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 linux-2.6.29.orig/drivers/video/logo/Makefile linux-2.6.29/drivers/video/logo/Makefile ---- linux-2.6.29.orig/drivers/video/logo/Makefile 2009-05-14 22:21:12.000000000 +0200 -+++ linux-2.6.29/drivers/video/logo/Makefile 2009-05-14 22:35:42.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_OPENWRT_CLUT224) += logo_openwrt_clut224.o - - obj-$(CONFIG_SPU_BASE) += logo_spe_clut224.o - diff --git a/target/linux/s3c24xx/patches-2.6.29/060-patch-ar6000.patch b/target/linux/s3c24xx/patches-2.6.29/060-patch-ar6000.patch deleted file mode 100644 index 6e5ba875b0..0000000000 --- a/target/linux/s3c24xx/patches-2.6.29/060-patch-ar6000.patch +++ /dev/null @@ -1,36 +0,0 @@ -diff -ruN linux-2.6.29.orig/drivers/ar6000/ar6000/ar6000_drv.c linux-2.6.29/drivers/ar6000/ar6000/ar6000_drv.c ---- linux-2.6.29.orig/drivers/ar6000/ar6000/ar6000_drv.c 2009-06-23 11:24:09.000000000 +0200 -+++ linux-2.6.29/drivers/ar6000/ar6000/ar6000_drv.c 2009-06-23 12:09:00.000000000 +0200 -@@ -213,6 +213,7 @@ - int ar6000_init(struct net_device *dev); - static int ar6000_open(struct net_device *dev); - static int ar6000_close(struct net_device *dev); -+static int ar6000_cleanup(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); - -@@ -984,6 +985,7 @@ - unregister_netdev(dev); - } else { - ar6000_close(dev); -+ ar6000_cleanup(dev); - } - - free_raw_buffers(ar); -@@ -1090,8 +1092,15 @@ - static int - ar6000_close(struct net_device *dev) - { -- AR_SOFTC_T *ar = netdev_priv(dev); -+ /* Stop the transmit queues */ -+ netif_stop_queue(dev); -+ return 0; -+} - -+static int -+ar6000_cleanup(struct net_device *dev) -+{ -+ AR_SOFTC_T *ar = netdev_priv(dev); - /* Stop the transmit queues */ - netif_stop_queue(dev); - |